题目传送门

/*
题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路
SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cnt[n]
最大流==最小割,套个Dinic模板,以后再理解算法。。。
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std; const int MAXN = 2e3 + 10;
const int MAXM = 6e4 + 10;
const int INF = 0x3f3f3f3f;
struct Edge {
int v, w;
};
struct Flow {
int v, cap, rev;
};
bool vis[MAXN];
int cnt[MAXN];
int d[MAXN];
int lv[MAXN];
int it[MAXN];
vector<Edge> G[MAXN];
vector<Flow> F[MAXN];
int n, m; void add_edge(int u, int v, int cap) {
F[u].push_back ((Flow) {v, cap, (int) F[v].size ()});
F[v].push_back ((Flow) {u, 0, (int) F[u].size ()-1});
} void BFS(int s) {
memset (lv, -1, sizeof (lv));
queue<int> Q; Q.push (s); lv[s] = 0; while (!Q.empty ()) {
int u = Q.front (); Q.pop ();
for (int i=0; i<F[u].size (); ++i) {
Flow &e = F[u][i];
if (e.cap > 0 && lv[e.v] < 0) {
lv[e.v] = lv[u] + 1;
Q.push (e.v);
}
}
}
} int DFS(int u, int t, int f) {
if(u == t) return f;
vis[u] = true;
for (int &i=it[u]; i<F[u].size (); ++i) {
Flow &e = F[u][i];
if (e.cap > 0 && lv[u] < lv[e.v]) {
int d = DFS (e.v, t, min (f, e.cap));
if (d > 0) {
e.cap -= d; F[e.v][e.rev].cap += d;
return d;
}
}
}
return 0;
} int Dinic(int s, int t) {
int flow = 0, f;
for (; ;) {
BFS (s);
if (lv[t] < 0) return flow;
memset (it, 0, sizeof (it));
while ((f = DFS (s, t, INF)) > 0) flow += f;
}
} void build_graph(void) {
for (int i=1; i<=n; ++i) {
for (int j=0; j<G[i].size (); ++j) {
Edge &e = G[i][j];
if (d[i] + e.w == d[e.v]) {
add_edge (i, e.v, 1);
add_edge (e.v, i, 0);
}
}
}
} void SPFA(int s) {
for (int i=1; i<=n; ++i) {
d[i] = (i == s) ? 0 : INF;
cnt[i] = (i == s) ? 0 : INF;
}
memset (vis, false, sizeof (vis)); vis[s] = true;
queue<int> Q; Q.push (s); while (!Q.empty ()) {
int u = Q.front (); Q.pop ();
vis[u] = false;
for (int i=0; i<G[u].size (); ++i) {
int v = G[u][i].v, w = G[u][i].w;
if (d[v] == d[u] + w) cnt[v] = min (cnt[v], cnt[u] + 1);
if (d[v] > d[u] + w) {
d[v] = d[u] + w; cnt[v] = cnt[u] + 1;
if (!vis[v]) {
vis[v] = true; Q.push (v);
}
}
}
}
} int main(void) { //HDOJ 5294 Tricks Device
//freopen ("G.in", "r", stdin); while (scanf ("%d%d", &n, &m) == 2) {
for (int i=1; i<=n; ++i) G[i].clear ();
for (int i=1; i<=n; ++i) F[i].clear ();
for (int i=1; i<=m; ++i) {
int u, v, w; scanf ("%d%d%d", &u, &v, &w);
G[u].push_back ((Edge) {v, w});
G[v].push_back ((Edge) {u, w});
}
SPFA (1);
build_graph (); printf ("%d %d\n", Dinic (1, n), m - cnt[n]);
} return 0;
}

  

SPFA+Dinic HDOJ 5294 Tricks Device的更多相关文章

  1. HDOJ 5294 Tricks Device 最短路(记录路径)+最小割

    最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...

  2. HDU 5294 Tricks Device (最大流+最短路)

    题目链接:HDU 5294 Tricks Device 题意:n个点,m条边.而且一个人从1走到n仅仅会走1到n的最短路径.问至少破坏几条边使原图的最短路不存在.最多破坏几条边使原图的最短路劲仍存在 ...

  3. hdu 5294 Tricks Device 最短路建图+最小割

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...

  4. HDU 5294 Tricks Device 网络流 最短路

    Tricks Device 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 Description Innocent Wu follows D ...

  5. SPFA+Dinic HDOJ 3416 Marriage Match IV

    题目传送门 题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走) 分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) ...

  6. HDU 5294 Tricks Device 最短路+最大流

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 题意: 给你个无向图: 1.求最少删除几条边就能破坏节点1到节点n的最短路径, 2.最多能删除 ...

  7. hdu 5294 Tricks Device(2015多校第一场第7题)最大流+最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294   题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那 ...

  8. HDU 5294 Tricks Device(多校2015 最大流+最短路啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...

  9. HDU 5294 Tricks Device (最短路,最大流)

    题意:给一个无向图(连通的),张在第n个点,吴在第1个点,‘吴’只能通过最短路才能到达‘张’,两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:注意是 ...

随机推荐

  1. Linux下汇编语言学习笔记0 --- 前期准备工作

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  2. Linux下汇编语言学习笔记45 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  3. Kerberos认证浅析

    1 引言 在希腊神话中Kerberos是守护地狱之门的一条凶猛的三头神犬,而我们在本文中所要介绍的Kerberos认证协议是由美国麻省理工学院(MIT)首先提出并实现的,是该校雅典娜计划的一部分.这个 ...

  4. CSS3(各UI元素状态伪类选择器受浏览器的支持情况)

    选择器 Firefox Safari Opera IE Chrome E:hover Y Y Y Y Y E:active Y Y Y N Y E:focus Y Y Y Y Y E:enabled ...

  5. MongoDB小结11 - update【save】

    save是一个shell函数,调用它,可以在文档不存在时插入,存在时更新,它只有一个参数:文档.如果文档有 _id 这个 键,那么save会调用upsert,否则会调用insert,非常方便.

  6. Hibernate自定义简单主键生成

    Hibernate自定义主键生成 当使用Hibernate定义pojo的时候,有时候需要生成一定规则的数据表主键,这时候我们可以采用自定义主键生成方式去生成主键. 例如: 1.在pojo属性中定义数据 ...

  7. Why It is so hard to explain or show some thing

    Why it is hard to explain something or learn something? For example, when I first know the hadoop, I ...

  8. yarn-cli 添加

    添加依赖包 当你想使用另一个包时,你要先把它添加到依赖列表中.也就是执行 yarn add [package-name] 命令将它安装到你的项目中. 这也将同时更新你的 package.json 和  ...

  9. HDU1215--七夕节

    找出小于N的全部因子的和,N比較大,非常明显要打表来做,不然肯定会超时 方法就是枚举范围内每一个整数.然后再枚举范围内这个整数的全部的倍数,加上这个数 由于这个整数的倍数中一定含有这个整数因子,这样速 ...

  10. SQL语句小结

    1.创建数据库 create database 数据库名 2.删除数据库 drop  database 数据库名 3.创建表 1>.create table 表名 (col1 type1 [no ...