题目连接: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; }