最小生成树.
Kruskal 算法
代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 5 using namespace std; 6 7 typedef struct 8 { 9 int a, b; 10 int d; 11 int flag; 12 }node; 13 14 int set[102]; 15 node w[5002]; 16 17 int cmp(const void *a, const void *b) 18 { 19 node *pa=(node *)a; 20 node *pb=(node *)b; 21 return pa->d - pb->d; 22 } 23 24 int find(int n) 25 { 26 int k, r, j; 27 r=n; 28 while(r != set[r]) 29 r=set[r]; 30 k=n; 31 while (k != r) 32 { 33 j=set[k]; 34 set[k]=r; 35 k=j; 36 } 37 return r; 38 } 39 40 int merge(int a, int b) 41 { 42 int x=find(a); 43 int y=find(b); 44 if (x == y) 45 return 0; 46 set[x]=y; 47 return 1; 48 } 49 50 int main() 51 { 52 int n, i; 53 int sum, cnt; 54 while(scanf("%d", &n) && n) 55 { 56 for (i=1; i<=n; i++) 57 set[i]=i; 58 cnt=1; 59 for (i=0; i<n*(n-1)/2; i++) 60 { 61 scanf("%d%d%d%d", &w[i].a, &w[i].b, &w[i].d, &w[i].flag); 62 if (w[i].flag == 1) 63 { 64 set[w[i].a]=w[i].b; 65 cnt++; 66 } 67 } 68 qsort(w, n*(n-1)/2, sizeof(w[0]), cmp); 69 sum=0; 70 for (i=0; cnt<n; i++) 71 { 72 if (merge(w[i].a, w[i].b)) 73 { 74 cnt++; 75 sum+=w[i].d; 76 } 77 } 78 printf("%d\n", sum); 79 } 80 return 0; 81 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步