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;
    }

  • 相关阅读:
    【Mybatis】【10】foreach 批量操作
    【Java】【30】数据基本类型的转换
    【Mybatis】【9】ResultMap支持继承
    【记录】【4】各种工具
    【cmd】【4】ping IP或者域名,看是否能连通
    【cmd】【3】查看jdk安装路径
    【JS】【29】解决浏览器自动填充密码输入框的问题
    QQ登入(2)获取用户信息
    QQ登入(1)-有客户端直接授权,没客户端web授权
    百度定位
  • 原文地址:https://www.cnblogs.com/441179572qqcom/p/5719677.html
Copyright © 2011-2022 走看看