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的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...
随机推荐
- 【转】 Solr的SolrCloud与Master-slave主从模式对比
第一印象 SolrCloud是Solr4.0引入的,主要应对与商业场景.它很像master-slave,却能自动化的完成以前需要手动完成的操作.利用ZooKeeper这个工具去监控整个Solr集群,以 ...
- OneNote- 面经
- PAT (Advanced Level) Practise - 1094. The Largest Generation (25)
http://www.patest.cn/contests/pat-a-practise/1094 A family hierarchy is usually presented by a pedig ...
- 人品计算器 JFrame 窗体软件版 JPanel JTextField JTextArea JButtton JLabel setContentPane Swing包(用户界面工具包)
import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.eve ...
- linux分区之ext2,ext3,ext4,gpt
linux分区之ext2,ext3,ext4,gpt 2013-07-10 12:00:24 标签:ext3 gpt 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...
- 第18题:在O(1)时间删除链表结点+删除链表中重复的节点
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...
- 51nod——2478 小b接水(预处理 思维)
我本来想把每个谷都处理了,想了下觉得不好办.后来看其他人写的是处理每个位置,把每个位置可以接的水累加起来.整挺好. #include <bits/stdc++.h> using names ...
- FILE对象线程安全
根据apue讲述: 标准的IO例程可能从它们各自的内部数据结构的角度出发,是以线程安全的方式实现的!但在线程中,如果标准 IO例程都获取它们各自的锁,那么在做一次一个字符的IO时就会出现严重的性能下降 ...
- Date.prototype.Format---对Date的扩展
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...
- Fakeapp 入门教程(1):安装篇!
在众多AI换脸软件中Fakeapp是流传最广,操作最简单的一款,当然他同样也是源于Deepfakes. 这款软件在设计上确实是花了一些心事,只要稍加点拨,哪怕是再小白的人也能学会.下面我就做一个入门教 ...