sgu240:Runaway(二分+最短路)
来源:互联网 发布:下载软件管家360 编辑:程序博客网 时间:2024/05/21 07:56
题目大意:
(题目翻译摘自zzj大神犇,orzorzorz)
分析:
AC code:
#include <cstdio>#include <cmath>#include <cstdlib>#include <cstring>#include <cctype>#include <algorithm>#include <string>#include <sstream>#include <iostream>#include <map>#include <set>#include <list>#include <stack>#include <queue>#include <vector>#define ONLINE_JUDGEtypedef long long LL;typedef double DB;typedef long double LD;using namespace std;const int MAXN = 109, MAXM = 20009;const int INF = 0x3f3f3f3f;int n, m, h, s, e;struct Ugraph{ int size; int head[MAXN]; int to[MAXM]; int t[MAXM], r[MAXM], p[MAXM]; int ne[MAXM]; Ugraph(){size = 1;} void add_edge(int u, int v, int T, int R, int P) { to[size] = v, t[size] = T, r[size] = R, p[size] = P, ne[size] = head[u], head[u] = size++; to[size] = u, t[size] = T, r[size] = R, p[size] = P, ne[size] = head[v], head[v] = size++; }}G;int ext[MAXN];int dis[MAXN];bool vis[MAXN];int fr[MAXN];void spfa(int k){ queue<int> q; memset(dis, INF, sizeof(dis)); memset(vis, false, sizeof(vis)); memset(fr, 0, sizeof(fr)); q.push(s), dis[s] = 0, vis[s] = true; while(!q.empty()) { int now = q.front(); q.pop(), vis[now] = false; for(int i = G.head[now]; i; i = G.ne[i]) { int to = G.to[i], r = G.r[i], p = G.p[i], t = G.t[i]; if(dis[to] > dis[now]+t && r+p*(dis[now]+t) <= k) { dis[to] = dis[now]+t; fr[to] = now; if(!vis[to]) { vis[to] = true; q.push(to); } } } }}bool check(int k){ spfa(k); for(int i = 1; i <= e; ++i) if(dis[ext[i]] < INF) return true; return false; }void output(int x, int cnt){ if(!fr[x]) printf("%d", cnt); if(fr[x]) output(fr[x], cnt+1); printf(" %d", x);}int main(){ #ifndef ONLINE_JUDGE freopen("sgu240.in", "r", stdin); freopen("sgu240.out", "w", stdout); #endif scanf("%d%d%d%d%d", &n, &m, &h, &s, &e); for(int i = 1; i <= m; ++i) { int u, v, t, r, p; scanf("%d%d%d%d%d", &u, &v, &t, &r, &p); G.add_edge(u, v, t, r, p); } for(int i = 1; i <= e; ++i) scanf("%d", ext+i); int l = 0, r = INF; while(l < r) { int mid = (l+r)>>1; if(check(mid)) r = mid; else l = mid+1; } if(l > h) puts("NO"); else { puts("YES"); printf("%d\n", l); check(l); for(int i = 1; i <= e; ++i) if(dis[ext[i]] < INF) { output(ext[i], 1); break; } puts(""); } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0;}
0 0
- sgu240:Runaway(二分+最短路)
- hdu1839 二分+最短路
- csu1307 (最短路+二分)
- hdu1839 二分最短路
- hdu2962(最短路+二分)
- HDU1839(最短路+二分)
- hdu2962Trucking 二分+最短路
- hdu2363Cycling 二分+最短路
- bzoj1614(最短路+二分)
- 最短路 + 二分答案
- POJ3662 二分+最短路
- POJ3621-平均最短路,二分
- 【二分\最短路】架设电话线
- hdu2962之二分+最短路
- poj 3662 二分+最短路
- poj3662,二分 + 最短路,好题啊
- bzoj 1614(二分+最短路)
- poj 2253 二分/最短路
- In-Depth: Static Code Analysis
- LeetCode-java实现-T1-Two Sum
- 逆序输出单链表
- Linux 权限管理之一:文件夹的 rwx 权限
- 【项目实战】--Office文件预览
- sgu240:Runaway(二分+最短路)
- SpringBean的生命周期
- linux创建新进程的过程
- 集合框架的学习总结List,Set
- inupt textarea提示文字(点击消失,不输入恢复)
- Oracle sql developer 连接数据库显示IO错误的解决方法
- cocos2d-x3.1.1schedule_selector类型转换无效
- spring4.0源码下载
- Eclipse + Android + 真机调试的问题