zoukankan      html  css  js  c++  java
  • CCF 201609-4 交通规划(dij变形)

    问题描述

    试题编号: 201609-4
    试题名称: 交通规划
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:

    问题描述

      G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统。
      建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成高速铁路。现在,请你为G国国王提供一个方案,将现有的一部分铁路改造成高速铁路,使得任何两个城市间都可以通过高速铁路到达,而且从所有城市乘坐高速铁路到首都的最短路程和原来一样长。请你告诉G国国王在这些条件下最少要改造多长的铁路。

    输入格式

      输入的第一行包含两个整数nm,分别表示G国城市的数量和城市间铁路的数量。所有的城市由1到n编号,首都为1号。
      接下来m行,每行三个整数abc,表示城市a和城市b之间有一条长度为c的双向铁路。这条铁路不会经过ab以外的城市。

    输出格式

      输出一行,表示在满足条件的情况下最少要改造的铁路长度。

    样例输入

    4 5
    1 2 4
    1 3 5
    2 3 2
    2 4 3
    3 4 2

    样例输出

    11

    评测用例规模与约定

      对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 50;
      对于50%的评测用例,1 ≤ n ≤ 100,1 ≤ m ≤ 5000;
      对于80%的评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 50000;
      对于100%的评测用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000,1 ≤ ab ≤ n,1 ≤ c ≤ 1000。输入保证每个城市都可以通过铁路达到首都。

          题意大致就是给你一个铁路网络,然后要求你改造最少的铁路,以至于从所有城市乘坐高速铁路到首都的最短路程和原来一样长,这题就是用迪杰斯特拉跑个最短路,在求到每个点的最短路的同时维护cost[u]即起点到u节点的最短路所对应要改造的最少的铁路。

    #include<bits/stdc++.h>
    using namespace std;
    #define inf 100000000+5
    struct edge
    {
        int v,w,nxt;
        edge(int vv=0,int ww=0,int nxtt=0)
        {
            v=vv;
            w=ww;
            nxt=nxtt;
        }
    }e[200000+10];
    struct node
    {
        int v,w;
        node(int vv=0,int ww=0)
        {
            v=vv;
            w=ww;
        }
        friend bool operator<(const node&a,const node&b)
        {
            return a.w>b.w;
        }
    };
    int dis[10000+10],head[10000+10],cost[10000+10],vis[10000+10],n,m;//就比普通的dij多了个cost数组
    void dij()
    {
        for(int i=1;i<=n;i++)
            dis[i]=inf,vis[i]=0;
        dis[1]=0;
        cost[1]=0;
        priority_queue<node>q;
        while(!q.empty()) q.pop();
        q.push(node(1,dis[1]));
        while(!q.empty())
        {
            int u=(q.top()).v;
            q.pop();
            if(!vis[u])
            {
                vis[u]=1;
                for(int i=head[u];i!=-1;i=e[i].nxt)
                {
                    int v=e[i].v,w=e[i].w;
                    if(dis[v]>dis[u]+w)
                    {
                        dis[v]=dis[u]+w;
                        cost[v]=w;//表示到v的最短路对应要改造的铁路的最短长度为w,即u到v这条边的边权,因为起点到u的最短路所要改造的最短长度已经加在了u及其前面的点的cost值里了
                        q.push(node(v,dis[v]));
                    }
                    else
                        if((dis[v]==dis[u]+w)&&w<cost[v])//这种情况要注意
                            cost[v]=w;
                }
            }
    
        }
    }
    int main()
    {
        memset(head,-1,sizeof(head));
        int cnt=0,ans=0;;
        scanf("%d %d",&n,&m);
        while(m--)
        {
            int u,v,w;
            scanf("%d %d %d",&u,&v,&w);
            e[cnt]=edge(v,w,head[u]);
            head[u]=cnt++;
            e[cnt]=edge(u,w,head[v]);
            head[v]=cnt++;
        }
        dij();
        for(int i=2;i<=n;i++) ans+=cost[i];
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754881.html
Copyright © 2011-2022 走看看