P2784 道路费用
问题描述
输入格式
你的程序必须从标准输入读入。第一行包含三个由空格隔开的整数N,M和K。接下来的 M行描述最开始的M 条道路。这M行中的第i行包含由空格隔开的整数ai,bi和c i,表示有一条在a i和b i之间,费用为c i的双向道路。接下来的K行描述新建的K条道路。这 K行中的第i行包含由空格隔开的整数 xi和yi,表示有一条连接城镇xi和yi新道路。最后一行包含N个由空格隔开的整数,其中的第j个为pj,表示从城镇j 前往城镇 1的人数。
输入也满足以下约束条件。
1 ≤ N ≤ 100000;
1 ≤ K ≤ 20;
1 ≤ M ≤ 300000;
对每个i和j,1 ≤ ci, pj ≤ 10^6;
输出格式
你的程序必须输出恰好一个整数到标准输出,表示能获得的最大的收入。
样例输入
5 5 1
3 5 2
1 2 3
2 3 5
2 4 4
4 3 6
1 3
10 20 30 40 50
样例输出
400
首先,分析题目发现,本题给出的图的最小生成树是唯一的(每条边权值不同),于是我们先求出不含K条边的最小生成树A,再求出将K条边的权值设为0后的最小生成树B,容易发现,最后的目标最小生成树C中的边,一定来自A或给出的K条边中(B中除了给出的K条边外,其他边一定也在A中)。
同时观察可得,同时在A,B中出现的边一定是必须要选的边,因此我们可以利用这些边来缩点,将这些边构成的图中每一个联通块缩成一个点,这个点的人数等于该联通块所有点的人数和。
观察发现,缩点后最多存在K+1个点,由于K很小,为了求出答案,我们容易想到枚举K条边的子集,每次将选中的边先加入生成树C中,然后拿A中没用的边来跑生成树,此时的到的生成树C就是加入该子集后的目标生成树。
最后只需要枚举加入一条没选中的边,一定构成一个环,该环上每条边的权值不能大于该边的值,最后将每条边的权值取最大值,DFS算出每条边经过的人数,统计答案即可。
代码:
1 |
|