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;
    }
  • 相关阅读:
    fiddler 抓包工具(新猿旺学习总结)
    Monkey之常用ADB命令(新猿旺学习总结)
    APP压力测试 monkey(新猿旺学习总结)
    linux 系统shell运行程序不退出
    c++字节对齐编译器指令#pragma
    vmware 14 新安装centos7 没法联网
    windows dll的def文件
    c编译器字节对齐指令
    centos 7 进入图形界面
    cent os 7 与cent os 6区别
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5752124.html
Copyright © 2011-2022 走看看