POJ 1258 最小生成树模板 Kruskal算法 #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include<limits.h> #include<math.h> #include<queue> #include<stack> #define max(a, b) a>b?a:b; #define min(a, b) a<b?a:b; using namespace std; const int N = 11000; typedef struct rode { int x, y, l; } RODE; RODE maps[N]; int f[N]; int cmp(const void *a, const void *b) { RODE *c, *d; c=(RODE *)a; d=(RODE *)b; return c -> l - d -> l; } void Kruskal(int k); int Find(int x); int main() { int n, i, j, k, a; while(scanf("%d", &n)!=EOF) { k=0; for(i=0; i<n; i++) { f[i]=i; } for(i=0; i<n; i++) for(j=0; j<n; j++) { scanf("%d", &a); maps[k].x=i; maps[k].y=j; maps[k].l=a; k++; } qsort(maps, k, sizeof(maps[0]), cmp); Kruskal(k); } return 0; } void Kruskal(int k) { int ans=0; for(int i=0; i<k; i++) { int ru=Find(maps[i].x); int rv=Find(maps[i].y); if(ru!=rv) { f[ru]=rv; ans+=maps[i].l; } } printf("%d ", ans); } int Find(int x) { if(f[x]!=x) f[x]=Find(f[x]); return f[x]; } 另一种 prim算法 和dijkstra算法很像 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int Map[111][111]; const int oo=0xfffffff; int visit[111]; int dist[111]; int prim(int s,int n) { int ans=0; memset(visit,0,sizeof(visit)); for(int i=1; i<=n; i++) dist[i]=Map[s][i]; visit[s]=1; for(int i=1; i<n; i++) { int index; int Min=oo; for(int j=1; j<=n; j++) { if(!visit[j]&&dist[j]<Min) { index=j; Min=dist[j]; } } ans+=Min; visit[index]=1; for(int j=1; j<=n; j++) { if(!visit[j]&&dist[j]>Map[index][j]) { dist[j]=Map[index][j]; } } } return ans; } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { Map[i][j]=oo; } } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%d",&Map[i][j]); } } printf("%d ",prim(1,n)); } return 0; }