zoukankan      html  css  js  c++  java
  • 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 ",dijkstra(n));
        }
        return 0;
    }

  • 相关阅读:
    redhat 找不到eth0等网卡设备
    oracle12.2 windows 安装卸载重新学习
    Ubuntu官方推荐U盘镜像写入工具(转载别人的)
    linux sh 脚本获取命令结果变变量然后post
    img图片过长自动截取隐藏
    python 数字类型
    Pycharm 常用快捷键 转自 暮良文王
    #python输入输出
    勤学如春起之苗,不见其增日有所长。缀学如磨刀之石,不见其损日有所亏
    感冒了,好难受
  • 原文地址:https://www.cnblogs.com/441179572qqcom/p/5719677.html
Copyright © 2011-2022 走看看