hdu1233------------------第一道最小生成树prim算法
prim模板
这道题是我同时参考两个模板,才敲出来的!总的说,还行,一次AC!
prim已经理解了,加快进度啊!下午掌握Kruskal算法。
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[101][101];
int low[101]; //辅助数组,第 i(i不属于U集合)个点到 U 集合的最短距离
int visit[101];
const int da=100000000;
int n;
int prim()
{
int result=0;
int i,j,k;
int pos;
int min;
memset(visit,0,sizeof(visit)); //初始化,表示都没访问过
pos=1; //表示最小树的构造从第一个点开始
visit[pos]=1; //标记第一个点,相当于把第一个点划进 U集合
for(i=1;i<=n;i++) //辅助数组low[] 的初始化
if(i!=pos)
{
low[i]=map[pos][i];
}
for(i=1;i<n;i++)
{
min=da;
for(j=1;j<=n;j++)
{
if(!visit[j]&&min>low[j])
{
min=low[j];
pos=j;
}
}
result+=min;
visit[pos]=1;
for(j=1;j<=n;j++)
{
if(!visit[j]&&map[pos][j]<low[j])
low[j]=map[pos][j];
}
}
printf("%d\n",result);
return 0;
}
int main()
{
int i,j,k;
int s,e,w; //start点 end点 weight权
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=da; //初始化,刚开始都变成无限大,(我现在也不清楚有没有用)
for(i=1;i<=n*(n-1)/2;i++)
{
scanf("%d%d%d",&s,&e,&w);
map[s][e]=map[e][s]=w;
}
prim();
}
return 0;
}