题目:http://acm.hdu.edu.cn/showproblem.php?pid=1233
可以用Kruskal来做,不过当图的边比较稠密的时候用prime会更快一些。
AC代码:296MS
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int inf=0xffffff; int dis[105],sum,n; int weight[105][105]; void prime() { bool visit[105]; int pre[105]; memset(visit,0,sizeof(visit)); for(int i=1;i<=n;i++) {dis[i]=weight[1][i];pre[i]=1;} visit[1]=1; int index,mmin; for(int i=1;i<=n-1;i++) { mmin=inf; for(int j=1;j<=n;j++) { if(!visit[j] && dis[j]<mmin) { mmin=dis[j]; index=j; } } visit[index]=1; sum+=weight[pre[index]][index]; for(int i=1;i<=n;i++) { if(!visit[i] && weight[index][i]<dis[i]) { dis[i]=weight[index][i]; pre[i]=index; } } } } int main() { while(scanf("%d",&n)) { if(n==0)break; int m=n*(n-1)/2; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) weight[i][j]=inf; for(int i=0;i<m;i++) { int x,y,z; scanf("%d %d %d",&x,&y,&z); weight[x][y]=z; weight[y][x]=z; } sum=0; prime(); cout<<sum<<endl; } }