HDU 1863 畅通工程
一道很朴素的最小生成树,不过通过此题知道了,当n已经决定的情况下,若n个点无法构成最小生成树的话,最终得到ans无法得到精确的值,他会将无穷大的路径加入。
#include<stdio.h> #include<string.h> const int MAXN=110; const int INF=9999999; int mat[MAXN][MAXN]; int vis[MAXN]; int flag; int Prim(int n) { int lowcost[MAXN]; int mst[MAXN]; int i,j,min,minid,sum=0; for (i=1;i<=n;i++) { lowcost[i]=INF; vis[i]=0; mst[i]=1; } lowcost[1]=0; for (i=1;i<=n;i++) { min=INF; for (j=1;j<=n;j++) { if(lowcost[j]<min && !vis[j]) { min=lowcost[j]; minid=j; } } if(min==INF) flag=1; sum+=min; vis[minid]=1; for (j=1;j<=n;j++) { if(mat[minid][j]<lowcost[j]) { lowcost[j]=mat[minid][j]; mst[j]=minid; } } } return sum; } int main() { int n,m,i,j,a,b,c; int cas; while(scanf("%d%d",&m,&n) && m) { flag=0; cas=0; memset(vis,0,sizeof(vis)); for(i=0;i<=n;i++) for (j=0;j<=n;j++) mat[i][j]=INF; for (i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(c<mat[a][b]) mat[a][b]=mat[b][a]=c; } // printf("%d\n",cas); int ans=Prim(n); if(flag) printf("?\n"); else printf("%d\n",ans); } return 0; }