poj 1258
题意:给n*n矩阵 表示个点个边 求最小生成树
思路:Kruskal 算法
//:简单介绍一下题意。农民要建立互联网络,目的使村庄里所有的农民连上网, //并且总费用最小。多组数据,每组数据给出一个n,然后给出n * n大小的无向图的邻接矩阵表示,值表示边权。 //要求输出最小生成树的权值和。 #include<iostream> #include<cstring> using namespace std; int map[101][101]; int dist[101]; int s[101]; int n; void Krudkal() { int i,j; int sum=0; memset(s,0,sizeof(s)); for(i=1;i<=n;i++) dist[i]=map[1][i]; s[1]=1; for(i=1;i<n;i++) { int v=-1; int min=999999999; for(j=1;j<=n;j++) if(dist[j]<min&&!s[j]) { min=dist[j]; v=j; } if(v==-1) break; //if(min>max) max=min; s[v]=1; sum+=dist[v]; dist[v]=0; for(j=1;j<=n;j++) { if(dist[j]>map[v][j]) dist[j]=map[v][j]; } } cout<<sum<<endl; } int min(int x,int y) { if(x<y) return x; return y; } int main() { int t,i,j; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&map[i][j]); } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { int e=min(map[i][j],map[j][i]); map[i][j]=e; map[j][i]=e; } Krudkal(); } return 0; }