Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7278 Accepted Submission(s): 2079
1 #include<stdio.h> 2 #include<string.h> 3 #define MAX 1000000 4 int map[510][510]; 5 void prim(int n)//最好的prim的模板。 6 { 7 int k[510],v[510],i,j; 8 int min,sum=0,flag,count=1; 9 memset(k,0,sizeof(k)); 10 memset(v,0,sizeof(v)); 11 for(i=1;i<=n;i++) 12 k[i]=map[1][i]; 13 for(i=2;i<=n;i++) 14 { 15 min=MAX; 16 for(j=2;j<=n;j++) 17 { 18 if(min>k[j]&&v[j]==0) 19 { 20 min=k[j]; 21 flag=j; 22 } 23 } 24 sum+=min; 25 v[flag]=1; 26 for(j=1;j<=n;j++) 27 if(v[j]==0&&k[j]>map[flag][j]&&flag!=j) 28 k[j]=map[flag][j]; 29 } 30 if(sum<MAX) 31 printf("%d\n",sum); 32 else 33 printf("-1\n"); 34 } 35 int main() 36 { 37 int T,n,m,k,i,j,o,p,q,r,s,l; 38 int b[100]; 39 scanf("%d",&T); 40 while(T--) 41 { 42 scanf("%d%d%d",&n,&m,&k); 43 for(i=1;i<=n;i++) 44 for(j=1;j<=n;j++) 45 { 46 if(i==j) map[i][j]=0; 47 else 48 map[i][j]=MAX; 49 } 50 for(i=0;i<m;i++) 51 { 52 scanf("%d%d%d",&p,&q,&r); 53 if(r<map[p][q]) 54 { 55 map[p][q]=map[q][p]=r; 56 } 57 } 58 for(i=0;i<k;i++) 59 { 60 scanf("%d",&s); 61 for(j=0;j<s;j++) 62 scanf("%d",&b[j]); 63 for(o=0;o<s;o++) 64 for(l=o+1;l<s;l++) 65 { 66 map[b[o]][b[l]]=map[b[l]][b[o]]=0; 67 } 68 } 69 prim(n); 70 } 71 return 0; 72 }