http://acm.hdu.edu.cn/showproblem.php?pid=1301
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4145 Accepted Submission(s): 3020

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
经典的prim算法,但是要注意存入图的方式,并且要注意是无向图,赋值要对称赋值
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#define Maxint 0x7fffffff
int map[105][105],visit[105],low[105];
int n;
int prim()
{
int pos=1,i,j,minn,sum=0;
memset(visit,0,sizeof(visit));
visit[1]=1;
for(i=1;i<=n;i++)
{
if(i!=pos)
{
low[i]=map[pos][i];
}
}
for(i=1;i<n;i++)
{
minn=Maxint;
for(j=1;j<=n;j++)
{
if(visit[j]==0 && minn>low[j])
{
minn=low[j];
pos=j;
}
}
sum+=minn;
visit[pos]=1;
for(j=1;j<=n;j++)
{
if(visit[j]==0 && low[j]>map[pos][j])
{
low[j]=map[pos][j];
}
}
}
return sum;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF&&n!=0)
{
char a,b,c;
int m,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=Maxint;
getchar();
for(i=1;i<n;i++)
{
scanf("%c%d%*c",&a,&m);
//getchar();
for(j=1;j<=m;j++)
{
scanf("%c%d%*c",&b,&k);
map[a-64][b-64]=map[b-64][a-64]=k;//特别注意是无向图
}
}
int result=prim();
printf("%d\n",result);
}
return 0;
}
hdu 1301 最小生成树prim实现,布布扣,bubuko.com
原文:http://www.cnblogs.com/ccccnzb/p/3832301.html