hdu 畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1863
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #define maxn 200 6 using namespace std; 7 const int inf=1<<30; 8 9 int g[maxn][maxn]; 10 int dis[maxn]; 11 bool vis[maxn]; 12 int sum; 13 int n,m,a,b,c; 14 bool flag=true; 15 16 void prim() 17 { 18 memset(vis,false,sizeof(vis)); 19 for(int i=1; i<=n; i++) dis[i]=g[1][i]; 20 dis[1]=0; 21 vis[1]=true; 22 flag=true; 23 for(int i=1; i<n; i++) 24 { 25 int m=inf,x; 26 for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y]; 27 if(m==inf) {flag=false; break;} 28 sum+=m; 29 vis[x]=true; 30 for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]>g[x][y]) dis[y]=g[x][y]; 31 } 32 } 33 34 int main() 35 { 36 while(scanf("%d%d",&m,&n)!=EOF) 37 { 38 if(m==0) break; 39 for(int i=0; i<=n; i++) 40 { 41 for(int j=0; j<=n; j++) 42 { 43 if(i==j) g[i][j]=0; 44 else 45 g[i][j]=g[j][i]=inf; 46 } 47 } 48 for(int i=0; i<m; i++) 49 { 50 scanf("%d%d%d",&a,&b,&c); 51 g[a][b]=g[b][a]=c; 52 } 53 sum=0; 54 flag=true; 55 prim(); 56 if(!flag) printf("?\n"); 57 else 58 printf("%d\n",sum); 59 } 60 return 0; 61 }