SOJ2198 Highways 最小生成树 kruskal算法
第一次写博客
最小生成树入门题 附上链接
http://cstest.scu.edu.cn/soj/problem.action?id=2198
这是一道kruskal的模板题(刘汝佳的小白书——《算法竞赛与入门经典》上有基本一模一样的代码)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <string> 6 #include <iterator> 7 #include <algorithm> 8 #include <cstdlib> 9 #include <deque> 10 #include <queue> 11 #include <stack> 12 #include <map> 13 #include <vector> 14 #include <set> 15 #include <list> 16 using namespace std; 17 #define PI acos(-1.0) 18 #define INF 0x3f3f3f3f 19 #define MAX 1000005 20 #define MST(a,b) memset(a,b,sizeof(a)) 21 #define MOD 1000000007 22 #define EPS 1e-6 23 typedef long long LL; 24 typedef unsigned long long LLU; 25 int n,t; 26 int p[MAX],r[MAX],u[MAX],v[MAX],w[MAX];; 27 int cmp(const int i,const int j) { 28 return w[i] < w[j]; 29 } 30 int find(int x) { 31 return p[x] == x ? x : p[x] = find(p[x]); 32 } 33 int kruskal() { 34 int ans = 0; 35 for(int i = 0;i < n;i ++) 36 p[i] = i; 37 for(int i = 0;i < t;i ++) 38 r[i] = i; 39 sort(r,r + t,cmp); 40 for(int i = 0;i < t;i ++) { 41 int e = r[i]; 42 int x = find(u[e]); 43 int y = find(v[e]); 44 if(x != y) { 45 ans = max(ans,w[e]); 46 p[x] = y; 47 } 48 } 49 return ans; 50 } 51 int main() { 52 int cases; 53 scanf("%d",&cases); 54 while(cases --) { 55 t = 0; 56 scanf("%d",&n); 57 for(int i = 0;i < n;i ++) { 58 for(int j = 0;j < n;j ++) { 59 int tmp; 60 scanf("%d",&tmp); 61 if(j > i) { 62 u[t] = i; 63 v[t] = j; 64 w[t ++] = tmp; 65 } 66 } 67 } 68 printf("%d\n",kruskal()); 69 } 70 return 0; 71 }