Jungle Roads

题目:http://acm.hust.edu.cn/vjudge/contest/123674#problem/F

题意  有n个村子  输入n  然后n-1行先输入村子的序号和与该村子相连的村子数t  后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离  求链接所有村子的最短路径

思路:求最小生成树,得到一条加一条,知道全部联通。

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int map[10000][10000],d[10000],n,maxx=100000,sum,vis[1000];
int dijkstra(int n)
{
      int i,j,p,minc;
    sum=0;
    memset(vis,0,sizeof(vis));
    vis[0]=1;
    for(i=1;i<n;i++)  d[i]=map[0][i];
    for(i=1;i<n;i++)
    {
        minc=maxx;
        p=-1;
        for(j=0;j<n;j++)
          if(vis[j]==0&&minc>d[j])//找到最小的边作为最小生成树的边
          {
              minc=d[j];
              p=j;
          }
        if(minc==maxx)return -1;
        sum+=minc;//找到一个加一个
        vis[p]=1;
        for(j=0;j<n;j++)
           if(vis[j]==0&&d[j]>map[p][j])//不断更新数组,保留较小的值
              d[j]=map[p][j];
    }
    return sum;
}
int main()
{
    int i,j,n;
    int t,v;
    char a,b;
    while(scanf("%d",&n)&&n)
    {
         sum=0;
        for(i=0;i<n;i++)
           for(j=0;j<n;j++)
           {
               if(i==j) map[i][j]=0;
               else map[i][j]=maxx;
           }
        for(i=1;i<n;i++)
        {
            cin>>a>>t;
            while(t--)
            { cin>>b>>v;
                map[a-'A'][b-'A']=v;
                map[b-'A'][a-'A']=v;
            }
        }
        printf("%d\n",dijkstra(n));
    }
    return 0;
}

posted @ 2016-07-29 21:00  头像好帅  阅读(132)  评论(0编辑  收藏  举报