http://acm.hdu.edu.cn/showproblem.php?pid=1233
#include<stdio.h>
#include<string.h>
#define MAX 0x3f3f3f
int graph[110][110];
int visited[110],ps[110];
int cmp(int n)
{
int i,j,pos,sum=0,min;
memset(visited,0,sizeof(visited));
pos=1;
visited[1]=1; //加入到最小生成树中的标记为1
for(i=2;i<=n;i++) //第一次给ps赋值
ps[i]=graph[pos][i];
for(i=1;i<n;i++) //加点n-1次,
{
min=MAX;
for(j=1;j<=n;j++)
{
if(!visited[j]&&ps[j]<min)//pos在最小生成树的顶点集中,点j不在最小生成树的顶点集中
{
min=ps[j]; //找出这些边中的最小值
pos=j;
}
}
sum+=min;
visited[pos]=1; //将pos加入到顶点集中,加点法
for(j=1;j<=n;j++)
if(!visited[j]&&ps[j]>graph[pos][j])
ps[j]=graph[pos][j];
}
return sum;
}
int main()
{
int n,i,x,y,d;
int s;
while(scanf("%d",&n),n)
{
memset(graph,MAX,sizeof(graph)); //刚开始让数据均最大化
for(i=0;i<n*(n-1)/2;i++)
{
scanf("%d%d%d",&x,&y,&d);
graph[x][y]=graph[y][x]=d;//之后有可能从x开始,也有可能从y开始
}
s=cmp(n);
printf("%d\n",s);
}
return 0;
}
HDOJ还是畅通工程之--prim算法
最新推荐文章于 2020-05-08 17:46:07 发布