poj 1815(最小割、割集)
题目链接:http://poj.org/problem?id=1815
思路:题目要求是剔除多少个点,可以将其转化为剔除多少条边,因此需要拆点,将点i拆成i,i+n,便容量为1,表示每个人起的传递作用只能是一次。然后就是枚举了,删除某条边,如果求出的最小割比原来的要小,说明减少的是割边集。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- using namespace std;
- #define MAXN 444
- #define MAXM 4444444
- #define inf 1<<30
- struct Edge{
- int v,cap,next;
- }edge[MAXM];
- int n,vs,vt,NE,NV;
- int head[MAXN];
- void Insert(int u,int v,int cap)
- {
- edge[NE].v=v;
- edge[NE].cap=cap;
- edge[NE].next=head[u];
- head[u]=NE++;
- edge[NE].v=u;
- edge[NE].cap=;
- edge[NE].next=head[v];
- head[v]=NE++;
- }
- int level[MAXN],gap[MAXN];
- void bfs(int vt)
- {
- memset(level,-,sizeof(level));
- memset(gap,,sizeof(gap));
- level[vt]=;
- gap[level[vt]]++;
- queue<int>que;
- que.push(vt);
- while(!que.empty()){
- int u=que.front();
- que.pop();
- for(int i=head[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(level[v]!=-)continue;
- level[v]=level[u]+;
- gap[level[v]]++;
- que.push(v);
- }
- }
- }
- int pre[MAXN],cur[MAXN];
- int SAP(int vs,int vt)
- {
- bfs(vt);
- memset(pre,-,sizeof(pre));
- memcpy(cur,head,sizeof(head));
- int maxflow=,aug=inf;
- int u=pre[vs]=vs;
- gap[]=NV;
- while(level[vs]<NV){
- bool flag=false;
- for(int &i=cur[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap>&&level[u]==level[v]+){
- flag=true;
- pre[v]=u;
- u=v;
- aug=min(aug,edge[i].cap);
- if(v==vt){
- maxflow+=aug;
- for(u=pre[v];v!=vs;v=u,u=pre[u]){
- edge[cur[u]].cap-=aug;
- edge[cur[u]^].cap+=aug;
- }
- aug=inf;
- }
- break;
- }
- }
- if(flag)continue;
- int minlevel=NV;
- for(int i=head[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap>&&level[v]<minlevel){
- minlevel=level[v];
- cur[u]=i;
- }
- }
- if(--gap[level[u]]==)break;
- level[u]=minlevel+;
- gap[level[u]]++;
- u=pre[u];
- }
- return maxflow;
- }
- int map[MAXN][MAXN];
- int cut[MAXN];
- void Build()
- {
- NE=;
- memset(head,-,sizeof(head));
- for(int i=;i<=n;i++){
- if(cut[i])continue;
- for(int j=;j<=n;j++){
- if(cut[j])continue;
- if(i==j)Insert(i,i+n,);
- else if(map[i][j])Insert(i+n,j,inf);
- }
- }
- }
- int main()
- {
- int maxflow,ans;
- while(~scanf("%d%d%d",&n,&vs,&vt)){
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- scanf("%d",&map[i][j]);
- if(map[vs][vt]){
- puts("NO ANSWER!");
- continue;
- }
- vs+=n,NV=*n;
- memset(cut,,sizeof(cut));
- Build();
- maxflow=SAP(vs,vt);
- ans=;
- for(int i=;i<=n;i++){
- if(maxflow==)break;
- if(i==(vs-n)||i==vt)continue;
- cut[i]=;
- Build();
- int tmp=SAP(vs,vt);
- if(tmp<maxflow){ ans++,maxflow=tmp; }
- else cut[i]=;
- }
- printf("%d\n",ans);
- bool flag=true;
- for(int i=;i<=n;i++){
- if(cut[i]){
- printf(flag?"%d":" %d",i);
- flag=false;
- }
- }
- puts("");
- }
- return ;
- }
poj 1815(最小割、割集)的更多相关文章
- USACO 4.4 Pollutant Control (网络流求最小割割集)
Pollutant ControlHal Burch It's your first day in Quality Control at Merry Milk Makers, and already ...
- poj 2125(最小割)
题目链接:http://poj.org/problem?id=2125 思路:将最小点权覆盖转化为最小割模型,于是拆点建图,将点i拆成i,i+n,其中vs与i相连,边容量为w[i]-,i+n与vt相连 ...
- poj 3204(最小割--关键割边)
Ikki's Story I - Road Reconstruction Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 7 ...
- POJ 3469 最小割 Dual Core CPU
题意: 一个双核CPU上运行N个模块,每个模块在两个核上运行的费用分别为Ai和Bi. 同时,有M对模块需要进行数据交换,如果这两个模块不在同一个核上运行需要额外花费. 求运行N个模块的最小费用. 分析 ...
- 网络流 poj 3308 最小割
t个样例 n*m的矩阵 L个伞兵 给出每行每列装激光的花费 伞兵的位置 要求杀死所有伞兵 总费用为这些费用的乘积 求花费最小 建图 源点 -> 行 -> 列 -> 汇点 ...
- poj 3084 最小割
题目链接:http://poj.org/problem?id=3084 本题主要在构图上,我采用的是把要保护的房间与源点相连,有intruder的与汇点相连,相对麻烦. #include <cs ...
- poj 3469 最小割模板sap+gap+弧优化
/*以核心1为源点,以核心2为汇点建图,跑一遍最大流*/ #include<stdio.h> #include<string.h> #include<queue> ...
- POJ 1815 Friendship(最小割)
http://poj.org/problem? id=1815 Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissio ...
- poj 1815 Friendship 字典序最小+最小割
题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all th ...
随机推荐
- 基于SpringBoot的Environment源码理解实现分散配置
前提 org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性.Envi ...
- HBuilder 打包 vue-cli 构建的 APP
1.在打包之前需要修改一个地方,那就是config->index.js文件,修改assetsPublicPath: '/'为assetsPublicPath: './',截图如下 上面文件改好后 ...
- win64 QT(VS2013) 配置 CGAL+libQGLViewer
网上讲的都不是太全 我来说说把~ 首先感谢这位大神: chenwk891:http://blog.csdn.net/chenwk891/article/details/42171495#reply 还 ...
- tmux入门 : 3. 会话
上一节我们已经将 tmux 安装好了,现在就可以通过以下命令来启动它: $ tmux 启动之后,可以看到命令行最底部多了一条绿色的状态条,上面显示了一些信息,比如计算机名和时间等. 要退出 tmu ...
- struts struts拦截器(过滤器)
在struts中尽量避免自定义拦截器,因为大部分需要自己定义拦截器的时候,设计思路就不对了.大部分拦截器框架都有给你定义好了.而且如果在struts中定义拦截器相当于和这个框架绑定了,假如以后要扩展或 ...
- java集成jpush实现客户端推送
代码地址如下:http://www.demodashi.com/demo/13700.html 前言 java 集成jpush 实现客户端推送 一.准备工作 开发环境: jdk1.6 Eclipse ...
- Sphinx-简介及原理
1.Sphinx简介 是一款基于SQL的高性能全文检索引擎(还不支持NoSQL), 主要优点有: 1).创建和重建索引迅速 2).大数据量时检索速度较快 3).为很多脚本语言设计了检索API(如PHP ...
- mysql中如何统计某字段里某个字符的个数
select * from order where length(order_num)-length(replace(order_num,'8','')) = 4
- CentOS7关闭默认防火墙启用iptables防火墙
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤. 1.关闭firewall: systemctl stop firewalld.service #停止f ...
- unity, remove a scene from build settings
把scene添加到build settings的scenes in build列表里以后,如果想删除,没有菜单可用,但选中按delete即可. 参考:http://answers.unity3d.co ...