标签:des style http io ar color os sp java
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
1
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int map[550][550]; int visit[550]; int n; void prime() { int i,j,sum=0,min,k; memset(visit,0,sizeof(visit)); visit[1]=1; for(i=1;i<n;i++)//共需要构建n-1条边,所以共要循环n-1次 { min=1000; for(j=1;j<=n;j++)//n个顶点 { if(!visit[j]&&min>map[1][j]) { min=map[1][j]; k=j; } } if(min==1000)//要是有连通的边则min就会发生相应的变化 { break; } sum+=min; visit[k]=1; for(j=1;j<=n;j++) { if(!visit[j]&&map[1][j]>map[k][j]) map[1][j]=map[k][j]; } } if(min==1000) printf("-1\n"); else printf("%d\n",sum); } int main() { int num,m,k,p,q,c,t,i,j,a,b; scanf("%d",&num); while(num--) { //memset(map,1000,sizeof(map));//memset函数看来是有范围的只能对数组进行1,或者是0,的赋值,其他则没有办法赋值。 scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++)//数组初始化 { for(j=1;j<=n;j++) { map[i][j]=1000; } } for(i=0;i<m;i++) { scanf("%d%d%d",&p,&q,&c);//注意需要考虑重边的情况。 map[p][q]=map[p][q]>c?c:map[p][q]; map[q][p]=map[p][q]; } for(i=0;i<k;i++) { scanf("%d%d",&t,&a); for(j=t-1;j>0;j--) { scanf("%d",&b); map[a][b]=map[b][a]=0; } } prime(); } return 0; }
hdu 3371(Connect the Cities)(最小生成树)
标签:des style http io ar color os sp java
原文地址:http://blog.csdn.net/ice_alone/article/details/41278187