hdu_1863_prim模板

//基本思想是分成两个集合,每次找出一条最短的边(边的一个点在一个集合,另一点在另一集合) //注意更新,找出这一条最短的边之后,在另一个集合里的(新找到的点)点到达原来的集合有更小的边,就更新temp #include<iostream> #include<cstdio> using namespace std; int a[101][101]; //这里应该是101,而不是100,wa了n次 int temp[101]; //temp[j]表示在集合j(还未加进去的点)到集合i(已经加进去的点)的最短路 int visit[101]; int n,m; #define max 1000000000 void prim() { int i,j; int min,index; memset(visit,0,sizeof(visit)); for(i=1;i<=m;i++) temp[i]=a[1][i]; visit[1]=1; int sum=0; for(i=1;i<m;i++) { min=max; for(j=1;j<=m;j++) //找出一个最短的边 if(!visit[j]&&min>temp[j]) { index=j; min=temp[j]; } if(min==max) { printf("?/n"); return ; } visit[index]=1; sum+=min; for(j=1;j<=m;j++) //更新 if(!visit[j]&&j!=index&&a[j][index]<temp[j]) temp[j]=a[j][index]; } printf("%d/n",sum); } int main() { while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); int x,y,z; int i,j; for(i=1;i<=m;i++) for(j=1;j<=m;j++) if(i==j) a[i][j]=0; else a[i][j]=max; while(n--) { scanf("%d%d%d",&x,&y,&z); if(a[x][y]>z) a[x][y]=a[y][x]=z; } prim(); } return 0; }  

 

 

你可能感兴趣的:(hdu_1863_prim模板)