实在伤心,一口气A了三个畅通工程,太简单的原因把。这个畅通工程求的是最小的公路长度,就是最小生成树,点太少无向图,prim就好了。
#include<stdio.h> #include<string.h> int map[100][100],d[100],n; bool v[100]; int Prim() { int i,j,mim,pt,ret; memset(d,0x7f,sizeof(d)); memset(v,false,sizeof(v)); pt=1; v[1]=true; ret=0; while( true){ for( i=1; i<=n; i++) if( !v[i]&&map[pt][i]&&d[i]>map[pt][i]) d[i]=map[pt][i]; pt=-1; mim=0x7fffffff; for( i=1; i<=n; i++){ if( !v[i]&&mim>d[i] ){ mim=d[i]; pt=i; } } if( pt==-1) break; ret+=mim; v[pt]=true; } return ret; } int main() { int m,i,j,c; while( scanf("%d",&n)&&n){ m=n*(n-1)/2; memset(map,0,sizeof(map)); while( m--){ scanf("%d%d%d",&i,&j,&c); map[i][j]=c; map[j][i]=c; } printf("%d\n",Prim()); } return 0; }