URAL 2034 Caravans (最短路 + 二分)
来源:互联网 发布:新手特效制作软件 编辑:程序博客网 时间:2024/05/17 15:38
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2034
题意:给你起点s和终点t,找出从起点到终点的最短路(可能不止一条),再给你一点r,让你找出r点到这些最短路上最近距离的最大值
思路:最大化最小值,可以联想到二分,可以先对r点跑一次最短路,算出r点到其他点的最短距离p[i],然后二分答案跑s,t之间的最短路,如果在松弛过程中发现某点v到r的距离不小于p[v],那么就不把v点加入松弛队列
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <vector>#include <utility>#include <functional>#include <map>#include <string>using namespace std;const int maxn = 100010;const int mod = 1e9 + 7;const int inf = 0x3f3f3f3f;struct edge{ int to, nxt, w;} e[maxn * 2];int cnt;int n, m, mid;int head[maxn], vis[maxn], dis[maxn];int p[maxn];void init(){ cnt = mid = 0; memset(head, -1, sizeof(head)); memset(vis, 0, sizeof(vis));}void add(int u, int v, int w){ e[cnt].w = w; e[cnt].to = v; e[cnt].nxt = head[u]; head[u] = cnt++;}int spfa(int s, int t){ memset(dis, inf, sizeof(dis)); memset(vis, 0, sizeof(vis)); deque <int> que; que.push_back(s); dis[s] = 0; if (p[s] <= mid) return inf; while (!que.empty()) { int u = que.front(); que.pop_front(); vis[u] = 0; for (int i = head[u]; ~i; i = e[i].nxt) { int v = e[i].to; if (p[v] <= mid) continue; if (dis[v] > dis[u] + e[i].w) { dis[v] = dis[u] + e[i].w; if (!vis[v]) { vis[v] = 1; if (!que.empty() && dis[v] <= dis[que.front()]) que.push_front(v); else que.push_back(v); } } } } return dis[t];}int main(){ while (~scanf("%d%d", &n, &m)) { init(); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); add(u, v, 1); add(v, u, 1); } int s, t, g; scanf("%d%d%d", &s, &t, &g); memset(p, inf, sizeof(p)); spfa(g, s); for (int i = 1; i <= n; i++) p[i] = dis[i]; // for(int i = 1; i <= n; i++) // printf("%d ", p[i]); // printf("\n"); int ans = spfa(s, t); // printf("%d\n", ans); if (ans == inf) { puts("0"); continue; } int l = 0, r = n; while (l < r) { mid = (l + r) / 2; int res = spfa(s, t); if (res == ans) l = mid + 1; else r = mid; } printf("%d\n", l); } return 0;}
0 0
- URAL 2034 Caravans (最短路 + 二分)
- 【二分答案&&最短路】URAL
- URAL 1980 Road to Investor(二分+最短路)
- ural 2034. Caravans
- URAL 1980 Road to Investor 二分+最短路
- ural 1325. Dirt(最短路)
- spfa最短路 [URAL-1930]
- 【算法设计与数据结构】二分法解决最大值最小化问题—进阶篇— URAL 2034 Caravans
- URAL 2005. Taxi for Programmers (最短路 数学啊)
- ural 1325 Dirt(bfs最短路+优先队列)
- uva 10816(二分,最短路)
- hdu 1839(二分+最短路)
- hdu 2962(最短路+二分)
- hdu 1839(二分+最短路)
- hdu 2962 Trucking(二分+最短路)
- hdu 2962(二分答案+最短路)
- hdu1839 二分+最短路
- csu1307 (最短路+二分)
- ajax引擎demo和ajax运作过程浅析
- 开源中国iOS客户端学习——MBProgressHUD特效
- 百度地图api的url请求的参数规则
- adb命令查看包名和adb启动你的apk
- 为向量法求组合问题
- URAL 2034 Caravans (最短路 + 二分)
- OutOfMemoryError: PermGen space及其解决方法
- nodejs+express中利用中间件提高代码复用
- 创造新语言(1)——确定架构
- 玩转Arduino之开篇
- 4、角色
- 【ZJU】3863 Paths on the Tree 【浙大2015年4月校赛D题】 树分治
- NMock学习系列(一)--- 对象及数据库模拟介绍
- 利用GitHub开源组件PullToRefresh实现上拉下拉弹簧效果