Destroying the bus stations HDU - 2485(最小割点)
题意:
就是求最小割点
解析:
正向一遍spfa 反向一遍spfa 然后遍历每一条边,对于当前边 如果dis1[u] + dis2[v] + 1 <= k 那么就把这条边加入到网络流图中,
每个点拆点 边权为1
跑最大流即可
代码还是改的那一题。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
#include <vector>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 1e3 + , INF = 0xfffffff, maxm = ;
typedef long long LL;
int n,m, cnt, s, t, k;
int head[maxn], d[maxn], vis[maxn], dis1[maxn], dis2[maxn], head1[maxn], cur[maxn];
int from[maxm], to[maxm];
int bz[][], way[][]; struct edge
{
int u, v, c, next;
}Edge[maxm << ]; void add_(int u, int v, int c)
{
Edge[cnt].u = u;
Edge[cnt].v = v;
Edge[cnt].c = c;
Edge[cnt].next = head1[u];
head1[u] = cnt++;
} void add_edge(int u, int v, int c)
{
add_(u, v, c);
add_(v, u, );
} bool bfs()
{
mem(d, );
queue<int> Q;
Q.push(s);
d[s] = ;
while(!Q.empty())
{
int u = Q.front(); Q.pop();
for(int i = head1[u]; i != -; i = Edge[i].next)
{
edge e = Edge[i];
if(!d[e.v] && e.c > )
{
d[e.v] = d[u] + ;
Q.push(e.v);
if(e.v == t) return ;
}
}
}
return d[t] != ;
} int dfs(int u, int cap)
{
int ret = ;
if(u == t || cap == )
return cap;
for(int &i = cur[u]; i != -; i = Edge[i].next)
{
edge e = Edge[i];
if(d[e.v] == d[u] + && e.c > )
{
int V = dfs(e.v, min(e.c, cap));
Edge[i].c -= V;
Edge[i ^ ].c += V;
ret += V;
cap -= V;
if(cap == ) break;
}
}
if(cap > ) d[u] = -;
return ret;
} int Dinic()
{
int ans = ;
while(bfs())
{
memcpy(cur, head1, sizeof(head1));
ans += dfs(s, INF);
}
return ans;
} struct node
{
int u, v, w, next;
}Node[maxn * ]; void add(int u,int v,int w,int i)
{
Node[i].u = u;
Node[i].v = v;
Node[i].w = w;
Node[i].next = head[u];
head[u] = i;
}
void spfa(int s)
{
for(int i = ; i < maxn; i++) d[i] = INF;
queue<int> Q;
d[s] = ;
mem(vis,);
Q.push(s);
vis[s] = ;
while(!Q.empty())
{
int u = Q.front();Q.pop();
vis[u] = ;
for(int i=head[u]; i!=-; i=Node[i].next)
{
node e = Node[i];
if(d[e.v] > d[u] + e.w)
{
d[e.v] = d[u] + e.w;
if(!vis[e.v])
{
Q.push(e.v);
vis[e.v] = ;
}
}
} }
} int main()
{
int T,A,B;
while(~scanf("%d%d%d", &n, &m, &k))
{
if(n==&&m==&&k==)
break;
mem(way, );
mem(bz, );
mem(Node,);
mem(head,-);
mem(head1, -);
cnt = ;
for(int i=; i<m; i++)
{
scanf("%d%d",&from[i],&to[i]);
if(!bz[from[i]][to[i]])
{
add(from[i],to[i],,i), bz[from[i]][to[i]] = ;
way[from[i]][to[i]] = ;
}
}
s = , t = n;
spfa(s);
mem(Node,);
for(int i=; i<=n; i++)
dis1[i] = d[i];
mem(head,-);
for(int i=; i<m; i++)
add(to[i],from[i],,i);
spfa(t);
for(int i=; i<=n; i++)
dis2[i] = d[i];
mem(bz, );
s = + n, t = n;
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
if(way[i][j] && dis1[i] + dis2[j] + <= k)
add_edge(i, j, INF);
}
add_edge(i, i + n, );
} printf("%d\n",Dinic());
}
return ;
}
Destroying the bus stations HDU - 2485(最小割点)的更多相关文章
- 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)
Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...
- HDU 2485 Destroying the bus stations(!最大流∩!费用流∩搜索)
Description Gabiluso is one of the greatest spies in his country. Now he’s trying to complete an “im ...
- HDUOJ----2485 Destroying the bus stations(2008北京现场赛A题)
Destroying the bus stations ...
- Destroying the bus stations
Destroying the bus stations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1832 Acce ...
- hdu 2485 Destroying the bus stations 最小费用最大流
题意: 最少需要几个点才能使得有向图中1->n的距离大于k. 分析: 删除某一点的以后,与它相连的所有边都不存在了,相当于点的容量为1.但是在网络流中我们只能直接限制边的容量.所以需要拆点来完成 ...
- HDU 2485 Destroying the bus stations (IDA*+ BFS)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意:给你n个点,m条相连的边,问你最少去掉几个点使从1到n最小路径>=k,其中不能去掉1, ...
- HDU 2485 Destroying the bus stations(费用流)
http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意: 现在要从起点1到终点n,途中有多个车站,每经过一个车站为1时间,现在要在k时间内到达终点,问至少要 ...
- HDU 2485 Destroying the bus stations
2015 ACM / ICPC 北京站 热身赛 C题 #include<cstdio> #include<cstring> #include<cmath> #inc ...
- hdu 2485(最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2485 思路:题目的意思是删除最少的点使1,n的最短路大于k.将点转化为边,容量为1,费用为0,然后就是 ...
随机推荐
- JWT认证原理及使用
一.JWT原理: 参考文章:https://www.jianshu.com/p/180a870a308a 1.传统的登录方式: 浏览器输入用户名密码,服务端校验通过,根据用户信息生成一个token,将 ...
- SNMP 获取交换机端口相关信息
原文地址:https://blog.csdn.net/ysdaniel/article/details/37927541 我们想用snmpwalk查看网络设备的端口,MIB库中相关定义的信息如下: [ ...
- Contest1692 - 2019寒假集训第三十一场 UPC 11075 Problem D 小P的国际象棋
非常简单的单点修改+区间加+区间查询.我用的是最近刚学的区间修改版本树状数组. 直接维护即可,注意修改后的单点值已经不是a[i],或者b[i],要通过区间查询求单点.不然是错的. 区间修改版本树状数 ...
- php-fpm-运行原理(转)
转载自https://studygolang.com/articles/15073 php-fpm是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似.master进程 ...
- [转帖]一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS https://home.cnblogs.com/u/beyang/ 一台服务器,两个域名 首先购买https,获取到CA证 ...
- [转帖]web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全. https://www.cnblogs.com/1996V/p/7458377.html 感谢原作者写的内容 安全 ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
- liunx 运维知识二部分
Windows下的目录和Linux系统下的目录有什么区别? Windows目录下的文件一般都是分区(C盘,D盘...),C盘下面有什么目录,目录下面还有其他目录加上文件. Linux系统目录结构一切都 ...
- llegalStateException: getWriter() has already been called for this response
我使用Springmvc的处理器进行向AJAX传值时出现的问题 当我使用 PrintWriter out = response.getWriter();out.print("用户不存在,请先 ...
- Python基础知识1-基础语法
pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类 低级语言到高级语言 高级语言 程序Pr ...