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;
    }
  • 相关阅读:
    恼人的CON(转)
    CINRAD/SB 多普勒天气雷达
    如何将两个栅格数据图层求和并求并集
    javascript设置asp.net程序开始运行时ie最大化显示
    ArcGIS Engine中数据的加载(转载)
    发现了一个arcgis engine的一个bug
    带余除法
    第二数学归纳法
    concat和concat_ws()区别及MySQL的几个实用字符串函数
    oracle查询语句大全
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5752124.html
Copyright © 2011-2022 走看看