POJ1861(Network)-Kruskal
Sample Input
4 6
1 2 1
1 3 1
1 4 2
2 3 1
3 4 1
2 4 1
Sample Output
1
4
1 2
1 3
2 3
3 4
题目意思:4个点,6个边,每个边有对应的权值。最后输出一行为路径中最大的边的值,第二行为路径上边的总数,
第三行为每条边的始末编号。题目需要求出最小生成树的最大边的最小值。
1 /* 2 Problem: 1861 User: 3 Memory: 416K Time: 500MS 4 Language: C++ Result: Accepted 5 */ 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAX 15010 11 int p[1010];//存放父亲结点 12 13 struct Edge 14 { 15 int u; 16 int v; 17 int w; 18 }map[MAX],ans[MAX]; 19 20 bool cmp(Edge a,Edge b) 21 { 22 return a.w<b.w; 23 } 24 25 int Find(int a) 26 { 27 return a==p[a]?a:a=Find(p[a]); 28 } 29 30 int main() 31 { 32 int N,M,i; 33 int a,b,c; 34 cin>>N>>M; 35 for(i=0;i<=N;i++) 36 { 37 p[i] = i; 38 } 39 for(i=0;i<M;i++) 40 { 41 cin>>a>>b>>c; 42 map[i].u = a; 43 map[i].v = b; 44 map[i].w = c; 45 } 46 sort(map,map+M,cmp); 47 int count = 0; 48 int maxEdge = 0; 49 for(i=0;i<M;i++){ 50 int x = Find(map[i].u); 51 int y = Find(map[i].v); 52 if(x != y) 53 { 54 p[x] = y;//不在一个集合,合并 55 ans[count].u = map[i].u; 56 ans[count].v = map[i].v; 57 count ++; 58 if(map[i].w>maxEdge) 59 maxEdge = map[i].w; 60 } 61 } 62 cout<<maxEdge<<endl;//路径中最长的边 63 cout<<count<<endl;//边的总数 64 for(i=0;i<count;i++) 65 cout<<ans[i].u<<" "<<ans[i].v<<endl;/输出每条路径 66 return 0; 67 }
----------------------------------------------------------------------------------------------------------------转载请说明出处----------------------------------------------------------------------------------------------------------------------
你要做一个不动声色的大人了。不准情绪化,不准偷偷想念,不准回头看。去过自己另外的生活。你要听话,不是所有的鱼都会生活在同一片海里。
————————村上春树