您的位置:首页 > 其它

hdu 1879 最小生成树【prime算法】

2011-05-13 22:43 417 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1879

#include<stdio.h>
#include<string>
#define MAX 0x3fffffff
int map[101][101],dis[101],vis[101];
int main()
{
int n;
freopen("a.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
int i,j,k;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=MAX;
int m=n*(n-1)/2;
for(i=0;i<m;i++)//构造邻接矩阵
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d)
map[a][b]=map[b][a]=0;
else
map[a][b]=map[b][a]=c;
}
int sum=0;
for(i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
memset(vis,0,sizeof(vis));
vis[1]=1;
for(i=1;i<n;i++)//n-1次迭代!!!!因为n个点有n-1条边!!!!!!!!!!
{
int min=MAX;
for(j=1;j<=n;j++)
{
if(!vis[j] && dis[j]<min)
{
min=dis[j];
k=j;  //记下最小的点
}
}
vis[k]=1;//为1表示该节点权值已经是最小,为0是还不确定,应继续更新
sum+=dis[k];
for(j=1;j<=n;j++)
{
if(!vis[j] && dis[j]>map[k][j])//注意k,j相接!
dis[j]=map[k][j];
}
}
printf("%d/n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: