NightMare2(SCU4527+dijkstra+二分)

题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4527

题目:

题意:最短路的每条边除了边权之外还会有一个限制(财富,身上带的财富大于这个值则不能通过这条边),问能否在k的时间内逃离迷宫,能的话最多能携带多少财富。

思路:二分最终能携带的财富值,然后跑dijkstra。

代码实现如下:

  1 #include <set>
  2 #include <map>
  3 #include <queue>
  4 #include <stack>
  5 #include <cmath>
  6 #include <bitset>
  7 #include <cstdio>
  8 #include <string>
  9 #include <vector>
 10 #include <cstdlib>
 11 #include <cstring>
 12 #include <iostream>
 13 #include <algorithm>
 14 using namespace std;
 15 
 16 typedef long long ll;
 17 typedef pair<ll, ll> pll;
 18 typedef pair<ll, int> pli;
 19 typedef pair<int, ll> pil;;
 20 typedef pair<int, int> pii;
 21 typedef unsigned long long ull;
 22 
 23 #define lson i<<1
 24 #define rson i<<1|1
 25 #define bug printf("*********\n");
 26 #define FIN freopen("D://code//in.txt", "r", stdin);
 27 #define debug(x) cout<<"["<<x<<"]" <<endl;
 28 #define IO ios::sync_with_stdio(false),cin.tie(0);
 29 
 30 const double eps = 1e-8;
 31 const int mod = 10007;
 32 const int mx = 1e4 + 7;
 33 const int maxn = 5e4 + 7;
 34 const double pi = acos(-1);
 35 const int inf = 0x3f3f3f3f;
 36 const ll INF = 0x3f3f3f3f3f3f3f;
 37 
 38 int t, n, m, k, tot, u, v, w;
 39 ll cap, ans;
 40 int head[mx], vis[mx];
 41 ll dis[mx];
 42 
 43 struct edge {
 44     int v, w, next;
 45     ll cap;
 46 }ed[maxn<<2];
 47 
 48 void addedge(int u, int v, int w, int cap) {
 49     ed[tot].v = v;
 50     ed[tot].w = w;
 51     ed[tot].cap = cap;
 52     ed[tot].next = head[u];
 53     head[u] = tot++;
 54     ed[tot].v = u;
 55     ed[tot].w = w;
 56     ed[tot].cap = cap;
 57     ed[tot].next = head[v];
 58     head[v] = tot++;
 59 }
 60 
 61 void init() {
 62     tot = 0;
 63     memset(head, -1, sizeof(head));
 64 }
 65 
 66 bool dij(ll x) {
 67     memset(dis, inf, sizeof(dis));
 68     memset(vis, 0, sizeof(vis));
 69     priority_queue<pli, vector<pli>, greater<pli> > q;
 70     q.push(make_pair(0, 1));
 71     dis[1] = 0;
 72     while(!q.empty()) {
 73         int u = q.top().second; q.pop();
 74         if(vis[u]) continue;
 75         vis[u] = 1;
 76         for(int i = head[u]; ~i; i = ed[i].next) {
 77             int v = ed[i].v;
 78             if(ed[i].cap >= x && dis[v] > dis[u] + ed[i].w) {
 79                 dis[v] = dis[u] + ed[i].w;
 80                 q.push(make_pair(dis[v], v));
 81             }
 82         }
 83     }
 84     return dis[n] <= k;
 85 }
 86 
 87 int main() {
 88     //FIN;
 89     scanf("%d", &t);
 90     while(t--) {
 91         scanf("%d%d%d", &n, &m, &k);
 92         init();
 93         ll ub = 0, lb = 0, mid;
 94         for(int i = 1; i <= m; i++) {
 95             scanf("%d%d%lld%d", &u, &v, &cap, &w);
 96             addedge(u, v, w, cap);
 97             if(cap > ub) ub = cap;
 98         }
 99         ans = -1;
100         while(ub >= lb) {
101             mid = (ub + lb) >> 1;
102             if(dij(mid)) {
103                 lb = mid + 1;
104                 ans = mid;
105             }
106             else ub = mid - 1;
107         }
108         if(ans != -1) printf("%lld\n", ans);
109         else printf("Poor RunningPhoton!\n");
110     }
111     return 0;
112 }

 

posted @ 2018-08-05 22:38  Dillonh  阅读(240)  评论(0编辑  收藏  举报