HDU 5889 Barricade(最短路+最小割水题)
Barricade
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1418 Accepted Submission(s): 417
For each test case, in the first line there are two integers N(N≤1000) and M(M≤10000).
The i-the line of the next M lines describes the i-th edge with three integers u,v and w where 0≤w≤1000 denoting an edge between u and v of barricade cost w.
题目链接:HDU 5889
去年的青岛网络赛一道题,当时只会最短路算法就不会做这水题…………,然而其他几道真正的水题当时也不会做……真是太差劲了……
跑一遍最短路后把最短路上的边加入网络流计算最小割即可,题目说边权相同直接BFS出最短距离就好了。
把dx打成d狂TLE(我可能做了假题目),然后这题有个细节要注意一下,虽然给的是无向图,但是最短路网络中要是有向的,如果当成双向边加入网络流就会WA。
看下这个例子就知道了,实际上1-2-3-4这条路径并不是到最短路径,但由于双向边的关系会使得这条路径连通,导致多出来的1流量流到4

对应数据:
100
4 4
1 4 1
1 2 1
2 3 1
3 4 1
若添加双向边到网络流中则答案变成2,正确的为1
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 1010;
const int M = 10010;
struct Edge
{
int to, nxt, dx, data;
Edge() {}
Edge(int _to, int _nxt, int _dx, int _data): to(_to), nxt(_nxt), dx(_dx), data(_data) {}
};
struct edge
{
int to, nxt, cap;
edge() {}
edge(int _to, int _nxt, int _cap): to(_to), nxt(_nxt), cap(_cap) {}
};
Edge E[M << 1];
edge e[M << 1];
int H[N], h[N], tot, Tot;
int dx[N], d[N]; void init()
{
CLR(H, -1);
CLR(h, -1);
tot = 0;
Tot = 0;
CLR(dx, INF);
}
inline void addE(int s, int t, int D, int c)
{
E[Tot] = Edge(t, H[s], D, c);
H[s] = Tot++;
}
inline void adde(int s, int t, int c)
{
e[tot] = edge(t, h[s], c);
h[s] = tot++;
e[tot] = edge(s, h[t], 0);
h[t] = tot++;
}
void BFS(int s)
{
queue<int>Q;
Q.push(s);
dx[s] = 0;
while (!Q.empty())
{
int u = Q.front();
Q.pop();
for (int i = H[u]; ~i; i = E[i].nxt)
{
int v = E[i].to;
if (dx[v] == INF)
{
dx[v] = dx[u] + 1;
Q.push(v);
}
}
}
}
int bfs(int s, int t)
{
CLR(d, -1);
d[s] = 0;
queue<int>Q;
Q.push(s);
while (!Q.empty())
{
int u = Q.front();
Q.pop();
for (int i = h[u]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (d[v] == -1 && e[i].cap > 0)
{
d[v] = d[u] + 1;
if (v == t)
return 1;
Q.push(v);
}
}
}
return ~d[t];
}
int dfs(int s, int t, int f)
{
if (s == t || !f)
return f;
int ret = 0;
for (int i = h[s]; ~i; i = e[i].nxt)
{
int v = e[i].to;
if (d[v] == d[s] + 1 && e[i].cap > 0)
{
int df = dfs(v, t, min(f, e[i].cap));
if (df > 0)
{
e[i].cap -= df;
e[i ^ 1].cap += df;
ret += df;
f -= df;
if (!f)
break;
}
}
}
if (!ret)
d[s] = -1;
return ret;
}
int dinic(int s, int t)
{
int ret = 0;
while (bfs(s, t))
ret += dfs(s, t, INF);
return ret;
}
int main(void)
{
int tcase, n, m, a, b, c, i;
scanf("%d", &tcase);
while (tcase--)
{
init();
scanf("%d%d", &n, &m);
for (i = 0; i < m; ++i)
{
scanf("%d%d%d", &a, &b, &c);
addE(a, b, 1, c);
addE(b, a, 1, c);
}
BFS(1);
for (int u = 1; u <= n; ++u)
{
for (int j = H[u]; ~j; j = E[j].nxt)
{
int v = E[j].to;
if (dx[v] - dx[u] == 1)
adde(u, v, E[j].data);
}
}
printf("%d\n", dinic(1, n));
}
return 0;
}
HDU 5889 Barricade(最短路+最小割水题)的更多相关文章
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- Barricade HDU - 5889(最短路+最小割)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- hdu 6852Path6(最短路+最小割)
传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...
- HDU - 6582 Path (最短路+最小割)
题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长. 解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保 ...
- HDU 3452 Bonsai(网络流之最小割)
题目地址:HDU 3452 最小割水题. 源点为根节点.再另设一汇点,汇点与叶子连边. 对叶子结点的推断是看度数是否为1. 代码例如以下: #include <iostream> #inc ...
- 【bzoj1266】[AHOI2006]上学路线route 最短路+最小割
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...
- HDU 5832 A water problem(某水题)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5889 Barricade(最短路+最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障 ...
- [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...
随机推荐
- 如何解决linux下apache启动时httpd: apr_sockaddr_info_get() failed for 报错
今天在家里的RHLE5.5上安装apache的时候,先用user1用户./configure命令配置,然后才用root用户make && make install,结果apache起来 ...
- Vue 恢复初始值的快速方法
vue 中经常定义很多data ,在用户进行一些操作后,需要讲data中的某个对象定义为初始值 例如 form: { title: '', describe: '', inspectionCatego ...
- split 分割压缩文件
1.普通tar压缩命令 tar -zcvf cm-11.tar.gz cm-11 //将cm-11文件夹压缩成cm-11.tar.gz 2.压缩后的文件太大,需要将cm-11.tar.gz分割成N个指 ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- CentOS---zookeeper安装(单机、伪集群、集群)
一:单机安装: 可以参考下面的伪集群安装方式 不同点: 不需要在data目录下创建 myid 文件 不需要配置集群 配置好后的启动和状态查询命令相同!! 二:伪集群模式 伪集群模式就是在同一主机上启动 ...
- python2, 3环境变量配置(win10下)
1.找到此电脑,右击点击属性 2.左边侧栏,高级系统设置 3.系统属性中点击高级 4.点击环境变量 5.可以看到 某某某用户变量和系统变量两个方框 其中,系统变量是要你在打开cmd是用管理员身份运行所 ...
- Install Jenkins 2.1.36 and openjdk 1.7.0 on centos 7
#!/bin/bash## Copyright (c) 2014-2015 Michael Dichirico (https://github.com/mdichirico)# This softwa ...
- shell数组脚本
#!/bin/bash array=( ) ;i<${#array[*]};i++)) do echo ${array[i]} done 脚本2 #!/bin/bash array=( ) fo ...
- tcl之变量-数组array
- 43.VUE学习之--组件之使用.sync修饰符与computed计算属性超简单的实现美团购物车原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...