Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
第一道Kruskal题目,贴代码,飘过~#include <iostream> #include <algorithm> #define MAX 500 using namespace std; int father[MAX]; //用来存储各个节点的父节点 int cmax; //用来存储最小生成树上面边的最大权值 struct edge { int x,y; int w; }e[MAX * MAX / 2]; //用来存储各个边的信息,x点至y点的权值为w bool cmp(edge a,edge b) //非降序排序排序函数 { return a.w < b.w; } int find_set(int a) //查找x所在的集合,回溯时顺便压缩路径 { if(a != father[a]) { father[a] = find_set(father[a]); } return father[a]; } void Union(int x,int y,int w) //合并两个集合,并在合并集合的过程当中不断地更新生成树里面的最大权值,记录到cmax里面 { if(x == y) return ; father[y] = x; if(w > cmax) cmax = w; } int main() { int t,n,i,j,k; int temp; scanf("%d",&t); while(t--) { k = 0; cmax = 0; scanf("%d",&n); for(i = 0;i < n;i++) { father[i] = i; //初始化集合 for(j = 0;j < n;j++) { /*因为是无向图,输入的时候只输入右上方三角的信息就可以了*/ if(i < j) { e[k].x = i; e[k].y = j; scanf("%d",&e[k].w); k++; } else scanf("%d",&temp); } } sort(e,e + k,cmp); //排序 for(i = 0;i < k;i++) { Union(find_set(e[i].x),find_set(e[i].y),e[i].w); } cout << cmax << endl; //输出结果 } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator