zoukankan      html  css  js  c++  java
  • CCF 201609-4 交通规划

    题意:

    问题描述
      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[i]表示到达第i个点所要增加的最小距离。
    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 100000 + 10;
    const int INF = 0x7f7f7f7f;
    struct Edge{
        int from, to, dist;
        Edge(int f, int t, int d):from(f), to(t), dist(d){}
    };
    struct HeapNode{
        int d, u;
        HeapNode(int dd, int uu):d(dd), u(uu){}
        bool operator < (const HeapNode&rhs)const{
            return d > rhs.d;
        }
    };
    struct Dijkstra{
        int n, m;
        vector<Edge> edges;
        vector<int> G[MAXN];
        bool done[MAXN];
        int d[MAXN];
        int p[MAXN];
        int cost[MAXN];
        void init(int n){
            this -> n = n;
            for(int i = 0; i <= n; ++i){
                G[i].clear();
            }
            edges.clear();
        }
        void AddEdge(int from, int to, int dist){
            edges.push_back(Edge(from, to, dist));
            m = edges.size();
            G[from].push_back(m - 1);
        }
        void dijkstra(int s){
            priority_queue<HeapNode> Q;
            for(int i = 0; i <= n; ++i) d[i] = INF;
            d[s] = 0;
            memset(done, 0, sizeof done);
            memset(cost, INF, sizeof cost);
            Q.push(HeapNode(0, s));
            while(!Q.empty()){
                HeapNode x = Q.top();
                Q.pop();
                int u = x.u;
                if(done[u]) continue;
                done[u] = true;
                for(int i = 0; i < G[u].size(); ++i){
                    Edge&e = edges[G[u][i]];
                    if(d[e.to] > d[u] + e.dist){
                        d[e.to] = d[u] + e.dist;
                        cost[e.to] = e.dist;
                        p[e.to] = G[u][i];
                        Q.push(HeapNode(d[e.to], e.to));
                    }
                    else if(d[e.to] == d[u] + e.dist){
                        cost[e.to] = min(cost[e.to], e.dist);
                    }
                }
            }
        }
    }dij;
    int main(){
        int n, m;
        scanf("%d%d", &n, &m);
        int a, b, c;
        dij.init(n);
        for(int i = 0; i < m; ++i){
            scanf("%d%d%d", &a, &b, &c);
            dij.AddEdge(a, b, c);
            dij.AddEdge(b, a, c);
        }
        dij.dijkstra(1);
        int ans = 0;
        for(int i = 2; i <= n; ++i){
            ans += dij.cost[i];
        }
        printf("%d
    ", ans);
        return 0;
    }
    

      

  • 相关阅读:
    MSSQL2005和Access在SQL的某一种写法上的区别。update的一种写法不一致。
    博客园 记录 了解多一点
    马克斯4.0 采集规则的编写
    谷歌代码托管 GoogleCode中 关于 版本的一个写法
    晒晒名企大公司的工资收入
    Asp.net中DataBinder.Eval用法的总结
    Mastering Debugging in Visual Studio 2010 A Beginner's Guide
    Solution Configuration but not Platform in VS2010 Toolbar
    window.showdialog完全手册,解决模态窗口,传值和返回值问题
    从此不再惧怕URI编码:JavaScript及C# URI编码详解
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/8584680.html
Copyright © 2011-2022 走看看