您的位置:首页 > 其它

zoj 1406 Jungle Roads

2011-08-17 16:08 246 查看
从A到F找到最短路即可,由于我不会用prim算法

只能用ku...算法,幸好这道题没有让输出路路径,

所以用ku...算法也行


我通常都是这样写的1.把边存起来2.快排3.并查集

呵呵,过了,还行吧

,对了输入注意用scanf

中的%d前加一个空格

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

typedef struct Tedge
{
int from,to;
int dist;
}edge;

edge dis[100];
int N;
int fa[30];

int find(int x)
{
if(x == fa[x])
return x;
fa[x] = find(fa[x]);
return(fa[x]);
}

int cmp(const void *a,const void *b)
{
return (*(edge *)a).dist - (*(edge *)b).dist;
}

int main()
{
int n,sub,m,d,i,count,sum;
char ch;
while(scanf("%d",&n)==1,n)
{
N = 0;
sub = n;
sub -= 1;
while(sub--)
{
scanf(" %c",&ch);
dis
.from = ch - 'A' + 1;
scanf("%d",&m);
for(i=1;i<m;i++)
dis[N+i].from = dis
.from;
while(m--)
{
scanf(" %c",&ch);
scanf("%d",&d);
dis
.to = ch - 'A' + 1;
dis
.dist = d;
N++;
}
}                                  //输入完成

qsort(dis,N,sizeof(edge),cmp);
for(i=1;i<=n;i++)
fa[i] = i;
count =0;
sum = 0;
for(i=0;i<N;i++)
{
if(find(dis[i].from) != find(dis[i].to))
{
fa[find(dis[i].from)] = find(dis[i].to);
sum += dis[i].dist;
count++;
if(count == (n-1))break;
}
}

printf("%d\n",sum);

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