安慰奶牛
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
Farmer John最近变得非常懒,他不想再继续维护供奶牛通行的道路。这些道路被用来连接N个牧场,牧场编号为1到N。每一个牧场是一个奶牛的家。FJ计划除去M条道路中尽可能多的道路,但是还要保持牧场之间的连通。因为奶牛们的交通系统被破坏了,所以她们非常伤心,于是,FJ决定去安慰她们。现在已知每条道路的起点S和终点E(1 <= S <= N,1 <= E <= N,S != E),以及走完这条路需要的时间L。当FJ到达第i个牧场的时候(即使已经到过),他必须花去Ci的时间和奶牛交谈。在早上出发和晚上回去的时候,他都需要和他所在牧场的奶牛交谈一次。假设一天可以谈完,谈完后必须回到早上出发的点(出发点可以任意选择),这样才算完成他的交谈任务。FJ想知道安慰所有的奶牛至少需要多长的时间,聪明的你能告诉他吗?
-
输入
-
多组测试数据。
对于每组数据,第1行包含两个整数N和M。
接下来N行,每行包含1个整数Ci(1<=Ci<=1000)。
接下来M行,每行包含三个整数S, E和L(1<=L<=1000)。
输出
- 输出一个整数, 表示所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。 样例输入
-
5 7 10 10 20 6 30 1 2 5 2 3 5 2 4 12 3 4 17 2 5 15 3 5 6 4 5 12
样例输出
-
176
思路:这就是一道简单的最小生成树的问题可是我们要注意的是 当我们去了一个地方我们要走回来的所以我们要把两个点的距离乘2
然后求出最小的那个用时最短的牧场过夜 加上去就可以了
下面看代码:
-
- #include<stdio.h>
- #include<iostream>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- #define max(a,b)((a > b)?(a):(b))
- #define MAX 0x7fffffff
- struct node
- {
- int u;
- int v;
- int cap;
- }edge[100100]; //每条路的属性的
- int d[100100];
- int p[100100]; //记录每个点的值的
- int f[100100]; //记录每个点的父亲节点的
- int M, n, m;
- bool cmp(node a,node b)
- {
- return a.cap < b.cap;
- }
- void add(int from,int to,int cap)
- {
- edge[M].u = from;
- edge[M].v = to;
- edge[M].cap = cap * 2 + p[from] + p[to]; //这个地方是去然后还得回来所以乘2
- M++;
- }
- int find(int x)
- {
- if(f[x] == x)return f[x];
- return f[x] = find(f[x]);
- }
- void kruskal()
- {
- int i;
- for(i = 1;i <= n;i++)
- {
- f[i] = i;
- d[i] = 0;
- }
- int u,v,fu,fv,sum = 0;
- for(i = 0;i < M;i++)
- {
- u = edge[i].u;
- v = edge[i].v;
- fu = find(u);
- fv = find(v);
- if(fu == fv)continue;//如果相同的话 那么久直接加就可以了
- sum += edge[i].cap;
- f[fu] = fv; //这个地方别忘了 一定要把父亲节点给写了
- //d[u]++;
- //d[v]++;
- }
- int tmp = MAX;
- for(i = 1;i <= n;i++)
- {
- if(tmp > p[i])tmp = p[i];
- }
- printf("%d\n",sum + tmp);
- }
- int main()
- {
- int i;
- int s,t,c;
- while(~scanf("%d%d",&n,&m))
- {
- for(i = 1;i <= n;i++)
- {
- scanf("%d",&p[i]);
- }
- for(i = 0;i < m;i++)
- {
- scanf("%d%d%d",&s,&t,&c);
- add(s,t,c);
- }
- sort(edge,edge + M,cmp);
- kruskal();
- }
- return 0;
- }
-
-
多组测试数据。