Gym 101873C - Joyride - [最短路變形][優先隊列優化Dijkstra]

題目連接:http://codeforces.com/gym/101873/problem/Cnode

題意:c++

這是七月的又一個陽光燦爛的日子,你決定和你的小女兒一塊兒度過快樂的一天。由於她真的很喜歡隔壁鎮上的仙女公園,因此你決定到那兒去玩一天。spa

你妻子贊成開車送你去公園接你。她很是準時,因此她確切地告訴你她何時會到公園的前門來接你,而你必須剛好在那個時間到那裏。由於你顯然也不想在外面等,這樣會讓你的小女兒傷心——她本能夠在公園裏多待些時間。code

如今你必須考慮遊玩計劃。你知道你何時到達,何時離開。公園由若干遊玩設施組成,兩兩之間由人行道相連。進入公園是免費的,但你每次使用在公園裏的某項設施,都必須付一次相應費用。你已經知道玩每一項遊玩設施各自須要多長時間、花多少錢。blog

當你穿過公園時,你顯然不能在沿着公園走的時候跳過遊樂設施(即便喬伊已經用了),不然喬伊會很傷心。由於喬很是喜歡公園,她很樂意玩同一個項目不止一次。在兩個遊樂項目之間行走須要必定的時間。ci

由於你是一個有計劃的家長,因此當你在公園的時候,你要儘可能少花錢。你能計算至少要花多少錢嗎?get

 

輸入:it

一行,一個整數 $x(1 \le x \le 1e3)$ 表明大家在公園玩的確切時間。io

一行,三個整數 $n,m,t(1 \le n,m,t \le 1e3)$,表明有 $n$ 個娛樂設施, 之間有 $m$ 條人行道鏈接,走人行道須要花費 $t$ 分鐘。class

$m$ 行,每行 $a,b$ 表明設施 $a,b$ 之間有一條小路。

$n$ 行,每行 $t,p$ 表明該項遊樂設施花費 $t$ 分鐘,$p$ 元。

你從設施 $1$ 出發,最後必須回到設施 $1$。

 

Sample Input 1
4
4 4 1
1 2
2 3
3 4
4 1
1 2
2 1
5 4
3 3
Sample Output 1
8

Sample Input 2
6
4 4 1
1 2
2 3
3 4
4 1
1 2
2 1
5 4
3 3
Sample Output 2
5

 

題解:

按花費錢的數量跑最短路,$dist[v][k]$ 表示在 $k$ 時刻走到點 $v$ 最少花費 $dist[v][t]$ 元。

 

AC代碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;

int x;
int n,m,w;
int t[maxn],p[maxn];

struct Edge{
    int u,v,w;
    Edge(){}
    Edge(int _u,int _v){u=_u, v=_v;}
};
vector<Edge> E;
vector<int> G[maxn];
void addedge(int u,int v)
{
    E.push_back(Edge(u,v));
    G[u].push_back(E.size()-1);
}

struct Qnode
{
    int v,k,d;
    Qnode(){}
    Qnode(int _v,int _k,int _d) {
        v=_v, k=_k, d=_d;
    }
    bool operator<(const Qnode& oth)const {
        return d>oth.d;
    }
};
int dist[maxn][maxn];
bool vis[maxn][maxn];
void dijkstra()
{
    memset(dist,0x3f,sizeof(dist));
    memset(vis,0,sizeof(vis));

    priority_queue<Qnode> Q;
    if(t[1]<=x) dist[1][t[1]]=p[1];
    else return;
    Q.push(Qnode(1,t[1],p[1]));
    while(!Q.empty())
    {
        int u=Q.top().v, k=Q.top().k; Q.pop();
        if(vis[u][k]) continue;
        vis[u][k]=1;
        if(k+t[u]<=x && dist[u][k+t[u]]>dist[u][k]+p[u])
        {
            dist[u][k+t[u]]=dist[u][k]+p[u];
            Q.push(Qnode(u,k+t[u],dist[u][k+t[u]]));
        }
        for(int i=0;i<G[u].size();i++)
        {
            Edge &e=E[G[u][i]]; int v=e.v;
            if(k+w+t[v]>x) continue;
            if(!vis[v][k+w+t[v]] && dist[v][k+w+t[v]]>dist[u][k]+p[v])
            {
                dist[v][k+w+t[v]]=dist[u][k]+p[v];
                Q.push(Qnode(v,k+w+t[v],dist[v][k+w+t[v]]));
            }
        }
    }
}

int main()
{
    cin>>x>>n>>m>>w;
    for(int i=1,u,v;i<=m;i++)
    {
        cin>>u>>v;
        addedge(u,v);
        addedge(v,u);
    }
    for(int i=1;i<=n;i++) cin>>t[i]>>p[i];
    dijkstra();
    if(vis[1][x]) cout<<dist[1][x]<<endl;
    else cout<<"It is a trap."<<endl;
}
相關文章
相關標籤/搜索