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)(最小生成树)
原文:http://blog.csdn.net/ice_alone/article/details/41278187