标签:
Input
* Line 1: Two space-separated integers, N and M.
Output
* Line 1: A single integer that is the length of the longest road required to be traversed.
Sample Input
3 31 3 43
43
In order to reach farm 2, Bessie travels along a road of length 23. To reach farm 3, Bessie travels along a road of length 43. With capacity 43, she can travel along these roads provided that she refills her tank to maximum capacity before she starts down a road.
Source
USACO 2005 March Silver
题目大意:1号农场的草被牛吃完了,Bessie必须从其他农场运草回来,总共有N个农场,Bessie要
去其他所有的农场运草回来,他想要使总路程最短并且路线能连接所有的农场。必须要考虑到路上
带的水袋大小。因为水袋大小和路线中距离最长的两个农场之间的路有关,现在Bessie想要求出满
足要求的路线中两个农场之间最长的路距离是多少。
思路:满足要求的路线其实就是最小生成树,路线中两个农场之间最长的路距离就是最小生成树上
最长的边。这样用Kruskal求最小生成树的时候,用Max求出最小生成树上最长的边。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 2100; const int MAXM = 40040; struct EdgeNode { int from; int to; int w; }Edges[MAXM]; int father[MAXN]; int find(int x) { if(x != father[x]) father[x] = find(father[x]); return father[x]; } int cmp(EdgeNode a,EdgeNode b) { return a.w < b.w; } void Kruskal(int N,int M) { sort(Edges,Edges+M,cmp); int Count = 0, Max = 0; for(int i = 0; i < M; ++i) { int u = find(Edges[i].from); int v = find(Edges[i].to); if(u != v) { father[v] = u; Count++; if(Max < Edges[i].w) Max = Edges[i].w; if(Count == N-1) break; } } cout << Max << endl; } int main() { int N,M; while(~scanf("%d%d",&N,&M)) { for(int i = 1; i <= N; ++i) father[i] = i; for(int i = 0; i < M; ++i) { scanf("%d%d%d",&Edges[i].from, &Edges[i].to, &Edges[i].w); } Kruskal(N,M); } return 0; } </span>
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/43088961