HDU3371-Connect the Cities
http://acm.hdu.edu.cn/showproblem.php?pid=3371
#include<stdio.h> #include<string.h> #define INF 0x7fffffff #define MAX 505 int sum,flag,num; void Prim(int map[][MAX],int n) { int dis[MAX],vis[MAX],i,j,k,min; for(i=1;i<n;i++) dis[i]=map[0][i]; memset(vis,0,sizeof(vis)); min=INF; for(i=1;i<n;i++) { min=INF; for(j=1;j<n;j++) if(vis[j]==0&&dis[j]<min) { min=dis[j]; k=j; } vis[k]=1; for(j=1;j<n;j++) if(!vis[j]&&dis[j]>map[k][j]) dis[j]=map[k][j]; } for(i=1;i<n;i++) if(dis[i]!=INF) { sum+=dis[i]; num++; } } int main(void) { int map[MAX][MAX],q[MAX],n,m,i,j,x,y,a,b,c,l,k,p; scanf("%d",&m); while(m--) { flag=num=0; scanf("%d%d%d",&n,&x,&y); for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]=INF; while(x--) { scanf("%d%d%d",&a,&b,&c); if(map[a-1][b-1]>c) map[a-1][b-1]=map[b-1][a-1]=c; } while(y--) { scanf("%d",&p); for(l=0;l<p;l++) { scanf("%d",&q[l]); q[l]--; } for(k=0;k<p;k++) for(l=0;l<p;l++) map[q[k]][q[l]]=map[q[l]][q[k]]=0; } sum=0; Prim(map,n); if(num==n-1) flag=1; if(flag) printf("%d\n",sum); else printf("-1\n"); } return 0; }