标签:others lin main AC else stand hdoj pos ssi
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3371
1 /* 2 问题 3 输入已经存在的图以及将要增加的边及其花费,计算并输出最小生成树还需要的最小花费 4 5 解题思路 6 将现在的图连起来使得它们的花费为0,再加入将要建设的边,直接跑一边prim即可,注意不能构成最小生成树 7 的情况说出-1,代码中的u == -1 结束很关键。 8 */ 9 #include<cstdio> 10 #include<cstring> 11 12 const int N=550; 13 const int INF=99999999; 14 int e[N+10][N+10],a[N],dis[N],bk[N]; 15 int prim(); 16 int n,m,k; 17 18 int main(){ 19 int T,i,j,q,t1,t2,t3,t; 20 scanf("%d",&T); 21 while(T--){ 22 for(i=1;i<=N;i++){ 23 for(j=1;j<=N;j++){ 24 e[i][j] = i==j?0:INF; 25 } 26 } 27 scanf("%d%d%d",&n,&m,&k); 28 for(i=1;i<=m;i++){ 29 scanf("%d%d%d",&t1,&t2,&t3); 30 if(e[t1][t2] > t3){ 31 e[t1][t2] = t3; 32 e[t2][t1] = t3; 33 } 34 } 35 for(i=1;i<=k;i++){ 36 scanf("%d",&t); 37 for(j=1;j<=t;j++){ 38 scanf("%d",&a[j]); 39 } 40 for(j=1;j<=t-1;j++){ 41 for(q=j+1;q<=t;q++){ 42 e[ a[j] ][ a[q] ]=0; 43 e[ a[q] ][ a[j] ]=0; 44 } 45 } 46 } 47 48 /*for(i=1;i<=n;i++){ 49 for(j=1;j<=n;j++){ 50 printf("%9d",e[i][j]); 51 } 52 printf("\n"); 53 }*/ 54 int ans=prim(); 55 if(ans == -1) 56 printf("-1\n"); 57 else 58 printf("%d\n",ans); 59 } 60 return 0; 61 } 62 63 int prim() 64 { 65 int i; 66 for(i=1;i<=n;i++) 67 dis[i]=e[1][i]; 68 memset(bk,0,sizeof(bk)); 69 bk[1]=1; 70 int c=1,sum=0,mina,u; 71 72 while(c < n){ 73 mina=INF; 74 u=-1; 75 for(i=1;i<=n;i++){ 76 if(!bk[i] && dis[i] < mina){ 77 mina=dis[i]; 78 u=i; 79 } 80 } 81 //printf("u==%d\n",u); 82 if(u == -1) 83 break; 84 bk[u]=1; 85 c++; 86 sum += dis[u]; 87 for(i=1;i<=n;i++){ 88 if(!bk[i] && dis[i] > e[u][i]) 89 dis[i] = e[u][i]; 90 } 91 } 92 if(u == -1) 93 return -1; 94 return sum; 95 }
HDU 3371 Connect the Cities(prim算法)
标签:others lin main AC else stand hdoj pos ssi
原文地址:https://www.cnblogs.com/wenzhixin/p/9053855.html