HDU 5294 Tricks Device 最短路+最大流
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5294
题意:
给你个无向图:
1、求最少删除几条边就能破坏节点1到节点n的最短路径,
2、最多能删除多少条边同时保证1到n的最短距离不变。
题解:
首先用spfa或dijcstra跑出所有最短路组成的DAG图。
用这个图跑最大流节能解决第一个问题,用这个图跑一遍bfs最短路就能解决第二个问题。
然而我在跑最大流的时候竟然把DAG图建成双向的了orz。。
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<utility>
#include<queue>
#include<cstring>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f; struct Edge {
int u, v, c, f;
Edge(int u, int v, int c, int f) :u(u), v(v), c(c), f(f) {}
Edge() {}
}; struct Dinic {
int n, m, s, t;
vector<Edge> egs;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn]; void init(int n) {
this->n = n;
for (int i = ; i < n; i++) G[i].clear();
egs.clear();
} void addEdge(int u, int v, int c) {
egs.push_back(Edge(u, v, c, ));
egs.push_back(Edge(v, u, , ));
m = egs.size();
G[u].push_back(m - );
G[v].push_back(m - );
}
bool bfs() {
memset(vis, , sizeof(vis));
queue<int> Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while (!Q.empty()) {
int x = Q.front(); Q.pop();
for (int i = ; i < G[x].size(); i++) {
Edge& e = egs[G[x][i]];
if (!vis[e.v] && e.c>e.f) {
vis[e.v] = ;
d[e.v] = d[x] + ;
Q.push(e.v);
}
}
}
return vis[t];
}
int dfs(int x, int a) {
if (x == t || a == ) return a;
int flow = , f;
for (int& i = cur[x]; i < G[x].size(); i++) {
Edge& e = egs[G[x][i]];
if (d[x] + == d[e.v] && (f = dfs(e.v, min(a, e.c - e.f)))>) {
e.f += f;
egs[G[x][i] ^ ].f -= f;
flow += f;
a -= f;
if (a == ) break;
}
}
return flow;
}
int Maxflow(int s, int t) {
this->s = s; this->t = t;
int flow = ;
while (bfs()) {
memset(cur, , sizeof(cur));
flow += dfs(s, INF);
}
return flow;
}
}dinic; int n, m; vector<pair<int, int> > G[maxn];
vector<pair<int,int> > pre[maxn]; int inq[maxn], d[maxn];
void spfa() {
queue<int> Q;
memset(inq, , sizeof(inq));
memset(d, 0x3f, sizeof(d));
d[] = ; inq[] = ; Q.push();
while (!Q.empty()) {
int u = Q.front(); Q.pop();
inq[u] = ;
for (int i = ; i < G[u].size(); i++) {
int v = G[u][i].first, w = G[u][i].second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
pre[v].clear(); pre[v].push_back(make_pair(u,w));
if (!inq[v]) {
Q.push(v); inq[v] = ;
}
}
else if (d[v] == d[u] + w) {
pre[v].push_back(make_pair(u,w));
}
}
}
} int dp[maxn];
int bfs() {
memset(dp, -, sizeof(dp));
queue<int> Q;
Q.push(n - ); dp[n - ] = ;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int i = ; i < pre[u].size(); i++) {
int v = pre[u][i].first;
if (dp[v] == -) {
dp[v] = dp[u] + ;
Q.push(v);
}
}
}
return dp[];
} void init() {
dinic.init(n);
for (int i = ; i < n; i++) G[i].clear(),pre[i].clear();
} int main() {
while (scanf("%d%d", &n, &m) == && n) {
init();
for (int i = ; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w); u--, v--;
G[u].push_back(make_pair(v, w));
G[v].push_back(make_pair(u, w));
}
spfa();
for (int i = n - ; i > ; i--) {
for (int j = ; j < pre[i].size(); j++) {
int v = pre[i][j].first;
//最后建出来的图应该是DAG图!
//dinic.addEdge(i, v, 1);
dinic.addEdge(v, i, );
}
}
int ans1 = dinic.Maxflow(,n-);
int ans2 = m-bfs();
printf("%d %d\n", ans1,ans2);
}
return ;
} /*
8 9
1 2 2
2 3 2
2 4 1
3 5 3
4 5 4
5 8 1
1 6 2
6 7 5
7 8 2 3 3
1 2 1
1 3 1
2 3 1 3 4
1 2 1
2 3 0
1 3 2
1 3 3 */
HDU 5294 Tricks Device 最短路+最大流的更多相关文章
- hdu 5294 Tricks Device 最短路建图+最小割
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...
- HDU 5294 Tricks Device (最大流+最短路)
题目链接:HDU 5294 Tricks Device 题意:n个点,m条边.而且一个人从1走到n仅仅会走1到n的最短路径.问至少破坏几条边使原图的最短路不存在.最多破坏几条边使原图的最短路劲仍存在 ...
- HDU 5294 Tricks Device 网络流 最短路
Tricks Device 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 Description Innocent Wu follows D ...
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...
- HDU 5294 Tricks Device(多校2015 最大流+最短路啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...
- hdu 5294 Tricks Device(2015多校第一场第7题)最大流+最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那 ...
- HDU 5294 Tricks Device (最短路,最大流)
题意:给一个无向图(连通的),张在第n个点,吴在第1个点,‘吴’只能通过最短路才能到达‘张’,两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:注意是 ...
- SPFA+Dinic HDOJ 5294 Tricks Device
题目传送门 /* 题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路 SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cn ...
- Tricks Device (hdu 5294 最短路+最大流)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
随机推荐
- html5 canvas画板
点击查看演示地址 <!DOCTYPE HTML> <html> <title>HTML5-CanvasDrawDemo</title> <meta ...
- WinForm程序安装、发布流程
一 签名 所谓签名就是给应用程序一个身份,申请一个专利.签名的时候需要选择证书.就向我们上学一样,得奖了老师给你发个证书.如果不进行签名,杀毒软件会把你打包后的exe文件作为病毒处理. 签名的步骤: ...
- Ubuntu12.04卡死的解决方案
刚开始安装的时候用着还行,不过后来发现用了一会总是会出现卡死的状况 后来看了下ubuntu12.04的内核是3.2,后来把内核升级到3.5发现这种情况不会出现了. 查看内核以及升级内核 uname - ...
- 利用java读写Excel文件
一.读取Excel文件内容 java 代码 public static String readExcel(File file){ StringBuffer sb = new StringBuffer( ...
- Linux服务器的初步配置流程
作者: 阮一峰 日期: 2014年3月14日 开发网站的时候,常常需要自己配置Linux服务器. 本文记录配置Linux服务器的初步流程,也就是系统安装完成后,下一步要做的事情.这主要是我自己的总结和 ...
- SVG矢量图--爱心
aixin.xml: <!-- height:width=viewportHeight:viewportWidth --> <vector xmlns:android="h ...
- jQuery操作 input type=checkbox的实现代码
代码如下: <input type="checkbox">: 2012欧洲杯"死亡之组"小组出线的国家队是:<br> <input ...
- IoC~高效的Autofac
http://www.cnblogs.com/lori/archive/2012/09/05/2671724.html http://www.cnblogs.com/kissdodog/p/36114 ...
- python学习应用笔记(一)
之前一直用c++写程序 所以考虑程序一般都比较容易往数据结构的方向想 而自己设计数据结构往往要费很大事 昨天看了一下python 发现脚本语言 真是厉害 用来进行模拟运算确实不错 可以先 ...
- 时隔一年,window.scroll
function scrollToTop() { return function(btn, input) { var flag = false; var timer; function autoScr ...