zoukankan      html  css  js  c++  java
  • 【Codeforces 229B】Planets

    【链接】 我是链接,点我呀:)
    【题意】

    【题解】

    设dis[i]表示到达i号传送器的最早时刻. 显然,虽然有那么多的出发时刻的限制,但我们还是越早到越好的. 因为你到得越早,出发的时间肯定不会比到达的时刻晚的差. 所以,就是一个最短路的问题啦. 因为数据范围比较大. 所以得用dijkstra+优先队列的优化. 在出去的时候,只要枚举一遍到达这个点的所有时刻,就能知道它啥时候出发了. 因为∑ki<=10^5,根据dijkstra算法也能知道,每个点作为最小值更新其他点只会用到一次. 所以这个枚举所有时刻的过程的复杂度是线性的,就只会枚举10^5次。 花点时间弄懂这个优先队列优化就ok啦。 剩下的就是模板了.

    【代码】

    #include <bits/stdc++.h>
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    using namespace std;
    
    const int N = 1e5;
    
    int n,m;
    vector<pair<int,int> > g[N+10];
    vector<int> a[N+10];
    int dis[N+10];
    priority_queue<pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > pq;
    
    int main()
    {
        scanf("%d%d",&n,&m);
        rep1(i,1,m){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            g[x].push_back(make_pair(y,z));
            g[y].push_back(make_pair(x,z));
        }
        for (int i = 1;i <= n;i++){
            int cnt;
            scanf("%d",&cnt);
            rep1(j,0,cnt-1){
                int x;
                scanf("%d",&x);
                a[i].push_back(x);
            }
        }
        rep1(i,1,n) dis[i] = -1;
        dis[1] = 0;
        pq.push(make_pair(0,1));
        while (!pq.empty()){
            pair<LL,int> temp = pq.top();pq.pop();
            int x = temp.second;LL disx = temp.first;
            if (dis[x]<disx) continue;
            rep1(i,0,(int)a[x].size()-1)
                if (a[x][i]==disx)
                    disx++;
            for (pair<int,int> temp1:g[x]){
                int y = temp1.first,cost = temp1.second;
                if (dis[y]==-1 || dis[y]>cost+disx){
                    dis[y] = cost+disx;
                    pq.push(make_pair(dis[y],y));
                }
            }
        }
        cout<<dis[n]<<endl;
        return 0;
    }
    
  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/AWCXV/p/9741863.html
Copyright © 2011-2022 走看看