Jungle Roads

题意:给你一个点,然后给你这个点可达的点,注意这是双向图

#include<stdio.h>



const int MAXN=30;

const int INF=0x7fffffff;



int map[MAXN][MAXN];

int n,ans;

int pre[MAXN];

int dist[MAXN];



void Prim()

{

    int i,j,k;

    int mn;

    bool p[MAXN];

    for(i=2; i<=n; i++)

    {

        dist[i]=map[1][i];

        pre[i]=1;

        p[i]=false;

    }

    dist[1]=0;

    p[1]=true;

    for(i=1;i<=n-1;i++)

    {

        mn=INF;

        k=0;

        for(j=1;j<=n;j++)

        {

            if(!p[j] && dist[j]<mn)

            {

                mn=dist[j];

                k=j;

            }

        }

        if(k==0) return ;

        p[k]=true;

        ans+=dist[k];

        for(j=1;j<=n;j++)

        {

            if(!p[j] && map[k][j]!=INF && dist[j]>map[k][j])

            {

                dist[j]=map[k][j];

                pre[j]=k;

            }

        }

    }

}



int main()

{

    int i,j,c,t;

    char a,b;

    while(scanf("%d",&n) && n)

    {

        for(i=1; i<MAXN; i++)

            for(j=1; j<MAXN; j++)

            {

                if(i==j) map[i][j]=0;

                else map[i][j]=INF;

            }

        getchar();

        for(i=0; i<n-1; i++)

        {

            scanf("%c%d",&a,&t);

            getchar();

            for(j=0; j<t; j++)

            {

                scanf("%c%d",&b,&c);

                getchar();

                map[a-'A'+1][b-'A'+1]=map[b-'A'+1][a-'A'+1]=c;//就是这里单向导致找了很久错

            }

         //   getchar();

        }

        ans=0;

        Prim();

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

    }

    return 0;

}

你可能感兴趣的:(OA)