题目传送门

/*
题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路
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. [转]MySQL5字符集支持及编码研究

    前言 在更新数据库时,有时会遇到这样的错误: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_general_ci,COER ...

  2. 【51NOD1766】树上的最远点对(线段树,LCA,RMQ)

    题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c< ...

  3. POJ 3279 Fliptile【枚举】

    题意: 又是农夫和牛的故事...有m*n个黑白块,黑块的背面是白块,白块背面是黑块,一头牛踩一块,则这个块的上下左右的方块都会转动,问至少踩多少块,才会使所有块都变成白色? 分析: 还是开关问题,同样 ...

  4. operamasks—omMessageBox的使用

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs&q ...

  5. guava cache学习

    Guava Cache与ConcurrentMap很相似,但也不完全一样.最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除.相对地,Guava Cache为了限制内存占 ...

  6. react组件是怎么来的

    组件的创造方法为React.createClass() ——创造一个类,react系统内部设计了一套类系统,利用它来创造react组件.但这并不是必须的,我们还可以用es6的class类来创造组件,这 ...

  7. shell脚本 加密备份MySQL数据库

    1.加密备份为.bak文件(实际只是个.zip文件) #!/bin/bash # $:IP地址 # $:用户名 # $:数据库密码 # $:数据库名 # $:加密密码 # $:备份文件名 mysqld ...

  8. .NET Core/.NET之Stream简介 Rx.NET 简介

    .NET Core/.NET之Stream简介   之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core ...

  9. 05-图1. List Components (25)

    05-图1. List Components (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue For a ...

  10. 编程算法 - 最小的k个数 代码(C)

    最小的k个数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出当中的最小k个数. 使用高速排序(Quick Sort)的方法 ...