zoukankan      html  css  js  c++  java
  • 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem D. Distance 迪杰斯特拉

    Problem D. Distance

    题目连接:

    http://codeforces.com/gym/100714

    Description

    In a large city a cellular network operator is holding a competition for subscribers to promote their new
    “pedestrian navigator” service. The main prize will be awarded to the first pair of subscribers to meet
    each other. The competition ends when any such meeting takes place.
    At the start of the competition all the subscribers are at their known positions, are able to see each other
    on their smartphones, and are moving at a constant speed of 10 km/h taking only pedestrian walks. Each
    subscriber is willing to win the prize and is indifferent to the others.
    In order to prepare for an award ceremony the cellular network operator needs to know the minimal
    amount of time after which the competition may come to an end.

    Input

    In the first line of input integers N, K, and L are given — the number of subscribers in a cellular network
    company (2 ≤ N ≤ 105
    ), the number of junctions (1 ≤ K ≤ 105
    ), and the number of pedestrian walks
    (1 ≤ L ≤ 105
    ) in the city, respectively.
    On the next N lines of input Si (1 ≤ Si ≤ K) numbers are given — initial positions of subscribers (in
    the terms of transport graph junctions).
    The next L lines of input pedestrian paths are given in the form of integers Bi
    , Ci and Di separated
    by spaces. Each line denotes that there is a two-way pedestrian path between junctions Bi and Ci
    (1 ≤ Bi
    , Ci ≤ K, Bi 6= Ci) with a length of Di (1 ≤ Di ≤ 5000) kilometers.

    Output

    Output the minimal possible number of minutes that may elapse from the start till the end of the contest.
    It is guaranteed that at least one pair of the subscribers can meet.

    Sample Input

    2 2 1
    1
    2
    1 2 5

    Sample Output

    15

    Hint

    题意

    有n个关键点,这个图一共有m个点,l条边,问你两个关键点之间最短距离是多少

    题解:

    暴力dij就好了,记录一下这个点的最短路是谁。

    然后边松弛边统计答案就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+6;
    const int inf = 1e9+1e7;
    vector<pair<int,int> > E[maxn];
    int n,k,l;
    int vis[maxn],use[maxn],dis[maxn],color[maxn];
    vector<int> st;
    int main(){
        scanf("%d%d%d",&n,&k,&l);
        for(int i=1;i<=n;i++){
            int x;scanf("%d",&x);
            st.push_back(x);
        }
        for(int i=1;i<=l;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            E[a].push_back(make_pair(b,c));
            E[b].push_back(make_pair(a,c));
        }
        int ans = inf;
        for(int i=1;i<=k;i++){
            dis[i]=inf;
            vis[i]=-1;
        }
        set<pair<int,int> >S;
        for(int i=0;i<st.size();i++){
            dis[st[i]]=0;
            color[st[i]]=i;
            S.insert(make_pair(0,st[i]));
            if(use[st[i]]){
                ans=0;
            }
            use[st[i]]=1;
        }
        while(!S.empty()){
            int now = S.begin()->second;
            S.erase(S.begin());
            for(int i=0;i<E[now].size();i++){
                int x = E[now][i].first;
                int v = E[now][i].second;
                if(color[x]!=color[now]&&color[x]!=-1)
                    ans=min(ans,v+dis[x]+dis[now]);
                if(dis[x]>dis[now]+v){
                    S.erase(make_pair(dis[x],x));
                    dis[x]=dis[now]+v;
                    color[x]=color[now];
                    S.insert(make_pair(dis[x],x));
                }
            }
        }
        cout<<ans*3<<endl;
    }
  • 相关阅读:
    装饰器的写法以及应用环境
    面向对象中super的作用
    os与sys模块的作用与常用方法
    python re模块
    python 冒泡排序,二分法
    正则表达式
    python 高阶内置函数
    python 内置函数
    python 生成器和生成器表达式
    python 函数名的应用(第一类对象),闭包,迭代器
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5752124.html
Copyright © 2011-2022 走看看