prim熟练了 就没用prim写,这次用kruskal熟练了不少~~下次继续~ 我怀疑它的数据中 输入的矩阵不是对称的。。。。 #include <stdio.h> #include <stdlib.h> #include <iostream> #define N 110 using namespace std; struct node { int x,y,len; }farm[N*N]; typedef struct node NODE; int cmp( const void *a,const void *b) { return ((NODE*)a)->len > ((NODE*)b)->len? 1 : -1; } int n,p,pre[N]; void input() { int map[N][N],x,y,len,i,j; p = 0; for(i=1; i<=n; i++) for(j=1; j<=n; j++) { cin >> farm[p].len; farm[p].x = i; farm[p].y = j; p++; } } int find(int x) { while( x!= pre[x]) x = pre[x]; return x; } void kruskal() { int i,a,b; qsort( farm, p, sizeof(NODE),cmp); for(i=1; i<=n; i++) pre[i] = i; int sum = 0; for(i=0; i<p; i++) { a = find( farm[i].x ); b = find( farm[i].y ); if(a != b) { sum += farm[i].len; pre[b] = a; } } cout << sum <<endl; } int main(void) { while( cin >> n && n) { input(); kruskal(); } return 0; } 。。。晕死。。我的prim的代码。。 #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 110 using namespace std; int map[MAX][MAX]; int Prim(int n) { int used[MAX],i,k; int dis[MAX]; memset(used,0,sizeof(used)); for(i=1; i<=n; i++) dis[i] = INT_MAX; int now = 1; used[now] = 1; dis[now] = 0; int sum = 0; for(i=1; i<n; i++) { for(k=1; k<=n; k++) if( !used[k] && dis[k] > map[now][k] ) dis[k] = map[now][k]; int min = INT_MAX; for(k=1; k<=n; k++) if( !used[k] && dis[k] < min ) min = dis[now = k]; sum += min; used[now] = 1; } return sum; } int main() { int n,i,k; while( ~scanf("%d",&n) ) { for(i=1; i<=n; i++) for(k=1; k<=n; k++) scanf("%d",&map[i][k]); int ans = Prim(n); printf("%d/n",ans); } return 0; }