您的位置:首页 > 其它

HDOJ还是畅通工程之--prim算法

2015-06-06 13:15 375 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: