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,然后就是 ...
随机推荐
- 九、xadmin菜单分组管理
有的时候,我们的菜单很多很杂,想要把菜单进行分组以方便管理,如下 前一篇博文已经详细讲解了如何菜单自定义排序,自定义分组和排序其实写法类似: 要实现上面这个功能,分为以下几步: 1. 我们需要定义一个 ...
- VUE工程上线首页加载慢问题优化
使用webpack-bundle-analyzer工具 下面介绍几种压缩文件的方式. 1.vue-router懒加载 2.工程文件打包的时候不生成.map文件 3.gzip压缩 4.CDN 5.VUE ...
- SDN 实验室学生们
SDN实验室系列:https://edu.cnblogs.com/campus/fzu/SdnLab --研究生及本科生们的博客及GitHub链接.欢迎各位大佬招募. 研究生 2018级 姓名 博客地 ...
- 记一个JS树结构路径查找
var a=[ { "id" : "0000", "text" : "R1", "children" ...
- 解决远程连接mysql很慢的方法(网络正常)
最近用mysql命令行或者JDBC远程连接mysql速度很慢,而且远大于ping时间.上网搜了一下,解决方案如下: 在/etc/mysql/my.cnf文件的[mysqld]部分加入:skip-nam ...
- Python_内置函数之max
源码: def max(*args, key=None): # known special case of max """ max(iterable, *[, defau ...
- Oracle 不小心删除undo数据文件以及磁盘空间不足导致不能登录的解决办法
在一次测试中,由于导入的数据量过大导致事务一直提交失败因为磁盘空间不够用了,一检查发现是undo表空间不够用,于是重新创建了一个表空间,准备把之前的undo表空间删除,删除时却发现一直删不掉,因为它一 ...
- 【开讲啦】20181029 oracle教学笔记
--创建表空间 create tablespace waterboss--表空间名称 datafile 'd:\waterboss.dbf'--用于设置物理文件名称 size 100m--用于设置表空 ...
- js的日期操作:String转date日期格式、求日期差
一.在js中String类型转成date格式 var date = new Date("2018-9-21 14:58:43");//就是这么简单 二.date转String类型就 ...
- 解决小程序webview缓存机制
在打开webview的时候在地址后面加上随机数或者字符串 并且H5页面使用文件hash