codeforces 230d(最短路+预处理)

链接: http://codeforces.com/problemset/problem/230/D

题意: n个点 m 条边 现在你找到从1到n的最短路,但是这里有一个限制就是如果你在时间t到达节点u 如果有其他人也在这个时间到节点u 那么你就要等这个人走了之后才能离开u。

思路: 对于每一个点开个vector 存其他人在什么时间到达,并且预处理出我如果在该时间到,我应该在什么时间离开。然后就是最短路了。坑点: 如果到节点n 直接记录最小值就可以了。

代码:

#include

using namespace std;
typedef long long ll;
const ll inf =1e18+5;
typedef pair pll;
const int N = 1e5+5;

struct node
{
    int v;
    ll w;
};

vectorve[N];
setse[N];
vectorve1[N];

int n,m,k;
int vis[N];
ll dis[N];

void dij()
{
    for(int i=0;i<=n;i++){
        dis[i]=inf; vis[i]=0;
    }
    priority_queue,greater >q;
    int l,r,mid,ans;
    if(se[1].count(0)){
        dis[1]=ve1[1][0].second;
        q.push(pll(ve1[1][0].second,1));
    }
    else{
        dis[1]=0;
        q.push(pll(0,1));
    }

    int u,v;
    ll w,dd;
    ll Ans=inf;
    while(!q.empty()){
        pll tmp=q.top(); q.pop();
        u=tmp.second;
        if(tmp.first>dis[u]) continue;
        vis[u]=1;

        for(int i=0;i>1;
                    if(ve1[v][mid].first<=w){
                        ans=mid;
                        l=mid+1;
                    }
                    else r=mid-1;
                }
                dd=ve1[v][ans].second;
                if(dd=0;j--){
            if(j==ve1[i].size()-1){
                ve1[i][j].second=ve1[i][j].first+1;
            }
            else{
                if(ve1[i][j].first==ve1[i][j+1].first-1){
                     ve1[i][j].second=ve1[i][j+1].second;
                }
                else ve1[i][j].second=ve1[i][j].first+1;

            }
        }
    }

    dij();

    return 0;
}

 

你可能感兴趣的:(最短路)