zoj 1406 Jungle Roads

从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[N].from = ch - 'A' + 1;
           scanf("%d",&m);
           for(i=1;i<m;i++)
              dis[N+i].from = dis[N].from;
           while(m--)
           {
                scanf(" %c",&ch);
                scanf("%d",&d);
                dis[N].to = ch - 'A' + 1;
                dis[N].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;
}


 

你可能感兴趣的:(ZOJ)