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 ...
随机推荐
- linux中的audit审计日志
这里首先介绍auditctl的应用,具体使用指南查看man auditctl.auditctl的man 描述说明这个工具主要是用来控制audit系统行为,获取audit系统状态,添加或者删除audit ...
- Varint编码
LevelDB内部通过采用变长编码,对数据进行压缩来减少存储空间,采用CRC进行数据正确性校验.下面就对varint编码进行学习. 传统的integer是以32位来表示的,存储需要4个字节,当如果整数 ...
- 纯js拖拽参考
function myDrag(obj){ obj.onmousedown=function(e){ var e=e||window.event; var diffX=e.clientX-this.o ...
- 多分类问题multicalss classification
多分类问题:有N个类别C1,C2,...,Cn,多分类学习的基本思路是"拆解法",即将多分类任务拆分为若干个而分类任务求解,最经典的拆分策略是:"一对一",&q ...
- ok6410的LCD裸机范例
/****************************************** 实验步骤 1.配置引脚功能,将其GPI.GPJ引脚设置为VD数据输出模式,及GPJ后几位设置成LCD时钟输出: ...
- 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...
- java 中 java.lang.ArrayIndexOutOfBoundsException: 0 异常
package test; public class Test { public static void main(String[] args) { final int num2 = Integer. ...
- Python核心编程--学习笔记--3--Python基础
本章介绍基本的Python语法.编程风格:并简要介绍标识符.变量和关键字,以及变量占用内存的分配和回收:最后给出一个较大的Python样例程序来体验这些特性. 1 语句和语法 1.1 注释 可以在一行 ...
- EMVTag系列5《8E 持卡人验证方法(CVM)列表》
L: var. up to 252 -R(需求):数据必须存在,在读应用数据过程中,终端不检查 按照优先顺序列出卡片应用支持的所有持卡人验证方法 注:一个应用中可以有多个CVM列表,例如一个用于国内交 ...
- Environment 类
提供有关当前环境和平台的信息以及操作它们的方法. 此类不能被继承. using System; using System.Collections; using System.Collections.G ...