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 ...
随机推荐
- Sqlserver数据库存储路径的修改
Sqlserver数据库存储路径的修改 Sqlserver数据库存储路径问题:本系统sqlserver路径默认是存储在C盘目录下的,由于数据会慢慢变大和避免重装系统数据丢失等问题,最好手动将路径设置在 ...
- PHPExcel上传sae遇到: -1:fail to get xml content
在用PHPExcel1.8.0来处理excel时,本地测试时好使的,但是要把代码部署到SAE,在上传代码的时候就会遇到这个问题. 部署代码中遇到问题: -1:fail to get xml conte ...
- Cassandra 有限分页策略
瀑布式分页 如果你的应用只需要瀑布式的分页,那么,Cassandra可以很好的支持,不过记得要指定好排序顺序. CLUSTERING ORDER BY (add_time DESC); 常见的分页,跳 ...
- [转发]导出Excel 格式 mso-number-format
应用中经常会遇到要从系统或数据库中导出数据平面文件,一般是导出到txt,csv或excel.txt和csv一般用在系统间的数据交换,而 excel一般有较好的显示效果,可以按照一定的模板导出,导出就不 ...
- zookeeper典型应用场景之一:master选举
对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用.于是,有了如下的 ...
- 3种方式实现Java多线程
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
- C#代码利用MongoDB中Group聚合函数查询
例子: public static void getUserRFM(DateTime beginTime, DateTime endTime) { MongoDat ...
- Android Material Design:基于CoordinatorLayout实现向上滚动导航条ToolBar滚出、向下滚动导航条滚出
activity_main.xml: <android.support.design.widget.CoordinatorLayout xmlns:android="http://sc ...
- IS上部署MVC网站,打开后ExtensionlessUrlHandler-
以管理员运行下面的命令注册: 32位机器: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 64位机器: C:\W ...
- 将python2.7+django1.10部署到SAE上
首先我想说的是我为什么选择SAE呢?本人学生一枚,没钱.然后sae好像又有免费的一定限额,所以我就选了它. 期间曲折颇多,实在不是三言两语所能道情的.各种百度,谷歌,最后所幸成功了,幸哉! 主要参考了 ...