POJ-1251-Jungle Roads
http://poj.org/problem?id=1251
最短路问题
Kruskal算法和Prim算法都可以
Kruskal
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct cam
{
int x;
int y;
int len;
}list[1000];
int f[1000];
int n,t;
int cmp(const void *a,const void *b)
{
return (*(struct cam *)a).len-(*(struct cam *)b).len;
}
void init()
{
int i;
for(i=1;i<=n;i++)
f[i]=i;
}
int find(int x)
{
int r=x;
while(f[r]!=r)
r=f[r];
f[x]=r;
return r;
}
void Union(int x,int y)
{
f[x]=y;
}
int main()
{
int i,m,len,num,ans;
int fx,fy;
char ch,str[10];
while(scanf("%d",&n),n)
{
t=0;
for(i=1;i<n;i++)
{
scanf("%s%d",str,&m);
getchar();
while(m--)
{
scanf("%c %d",&ch,&len);
getchar();
list[t].x=i;
list[t].y=ch-'A'+1;
list[t++].len=len;
}
}
qsort(list,t,sizeof(struct cam),cmp);
num=1;
ans=0;
init();
for(i=0;i<t;i++)
{
fx=find(list[i].x);
fy=find(list[i].y);
if(fx!=fy)
{
Union(fx,fy);
num++;
ans+=list[i].len;
if(num==n)
break;
}
}
printf("%d\n",ans);
}
return 0;
}
Prim
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 99999999
int n;
int map[100][100];
int visit[100];
int dis[100];
void prim()
{
int i,j,v,temp,sum;
memset(visit,0,sizeof(visit));
visit[1]=1;
for(i=1;i<=n;i++)
dis[i]=map[1][i];
dis[1]=0;
sum=0;
for(i=1;i<n;i++)
{
temp=INF;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j]<temp)
{
v=j;
temp=dis[j];
}
visit[v]=1;
sum+=temp;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j]>map[v][j])
dis[j]=map[v][j];
}
printf("%d\n",sum);
}
int main()
{
int i,m,len,j;
char ch,str[5];
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INF;
map[i][i]=0;
}
for(i=1;i<n;i++)
{
scanf("%s%d",str,&m);
getchar();
while(m--)
{
scanf("%c %d",&ch,&len);
getchar();
map[i][ch-'A'+1]=map[ch-'A'+1][i]=len;
}
}
prim();
}
return 0;
}