(二分图)洛谷P2071座位安排
洛谷P2071座位安排
思路:
网络流难在建图上面。
这题(应该也可以,我没尝试过)用二分图匹配去跑。可以拆点,将一排的座位拆成两个点,一个iii,一个i+ni+ni+n,然后匈牙利算法跑。
也可以用网络流跑最大流,将SSS向每个人iii连一条流量为111的边,再将每个人向他想坐的位置连一条流量为111的边,至于每排座位可以坐两个人,可以将每排座位向TTT连一条流量为222的边,这样就可以让他的最大流量是222了。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
const int N=5e5+210;
const int mod=1e9+7;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
struct edge
{int u,v,w;
}maze[N<<1];
int len=1,head[N]={0};
int dep[N];//深度
void add(int u,int v,int w)
{maze[++len]={head[u],v,w};head[u]=len;
}
int dfs(int u,int f,int t)
{int ans=0,i;if(u==t)return f;for(i=head[u];i && f;i=maze[i].u){int v=maze[i].v,w=maze[i].w;if(dep[v]==dep[u]+1 && w)//符合深度关系且能流 {int sum=dfs(v,min(f,w),t);maze[i].w-=sum;maze[i^1].w+=sum;f-=sum;ans+=sum;} }if(!ans)dep[u]=-2;return ans;
}
int bfs(int s,int t)
{queue<int> q;cl(dep,0);dep[s]=1;//源点深度为1q.push(s);while(!q.empty()){int u=q.front(),i;q.pop();for(i=head[u];i;i=maze[i].u){int v=maze[i].v,w=maze[i].w;if(w && !dep[v])//有深度且能流 {dep[v]=dep[u]+1;q.push(v); }}}return dep[t];
}
int dinic(int s,int t)
{int ans=0;while(bfs(s,t))ans+=dfs(s,maxn,t);return ans;
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,i;cin>>n;int s=0,t=3*n+1;for(i=1;i<=2*n;i++){int x,y;cin>>x>>y;add(s,i,1);add(i,s,0);add(i,x+2*n,1);add(x+2*n,i,0);add(i,y+2*n,1);add(y+2*n,i,0);}for(i=1;i<=n;i++){add(i+2*n,t,2);add(t,i+2*n,0);}cout<<dinic(s,t)<<endl;return 0;
}
(二分图)洛谷P2071座位安排相关推荐
- 洛谷 P2071 座位安排 seat.cpp/c/pas
P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...
- 洛谷 P2071 座位安排 (最大流 + 建图)
2020.7.15 今天先开个小差,这图书馆接近零下的气温给爷冻傻了,这还咋写题?马上回去了,练一练网络和tarjan吧. 这道题很简单,问有2n个人,n排座位,每个人都有喜欢的两个座位,最多能安置多 ...
- 洛谷P2071 座位安排
题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...
- 洛谷P1386座位安排
座位安排 今天,在机房里做了这道题目,我来整理一下思路. 首先读懂题意,这n个人是不需要按1到n来一次安排的,也就是说你可以先安排任意一个人. 那么有一种很好排除的情况,那就是对于大于等于i的作为的需 ...
- P2071 座位安排(二分图最大匹配)
P2071 座位安排(二分图最大匹配) 照着模板的套路,只不过座位是可以匹配两个人的,所以开个二维数组即可. 匈牙利常见的优化,vis数组能用bool就用bool,貌似用bitset更快?,建图的话单 ...
- P2071 座位安排
P2071 座位安排 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都 ...
- 洛谷P1160 队列安排 链表
洛谷P1160 队列安排 链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #i ...
- 二分图——洛谷P1155 双栈排序
https://daniu.luogu.org/problem/show?pid=1155 二分图染色+模拟 1.首先考虑一个简单情况--单栈排序,显然有这样的一个事实: a[i]和a[j] 不能压入 ...
- 洛谷-P1160 队列安排
题目 Problem Description 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次 ...
最新文章
- 清华魏少军:大部分AI芯片创业者将成为这场变革中的先烈
- c语言文件可用代码存放,C语言 文件(示例代码)
- 第12天续,CSS基础
- android studio编译提示错误:android Error:(21, 19) 错误: 程序包R不存在
- 关于SQL Server
- 内建函数对象(STL)
- 科技谋定功能性农业-农业大健康:中科微研携手从玉农业
- MFC中CString转换成char数组的问题
- JavaScript开发区块链只需200行代码 1
- Python判断素数(质数)
- 大型粒子对撞机已被上面叫停了!何祚庥:希望杨振宁李政道有生之年重归于好...
- HTML+css中鼠标经过触发等问题
- n维空间的欧氏距离公式_n维欧氏空间中球的体积公式与表面积公式之间的微分关系(论文资料).pdf...
- HowTo——cotex-m3处理器HardFault事后分析方法
- 在64位的Linux系统使用gcc的-m32选项编译32位的程序得到了多余的代码(多余指令call和add)、有多余的.text.__x86.get_pc_thunk.ax
- 从零实现Transformer、ChatGLM-6B、本地知识库、模型(训练/推理)加速
- Apache Griffin+Flink+Kafka实现流式数据质量监控实战
- oracle数据库之统计分析(方差、标准差、协方差)
- 计算机作品大赛成功举行,我系学生在2018年四川省大学生计算机作品赛中荣获一等奖...
- mipcms栏目分类调用
热门文章
- Arista 交换机升级手册
- 【教程】怎样在PC查看动漫之家(DMZJ)不能观看漫画
- LeetCode每日一题——1758. 生成交替二进制字符串的最少操作数
- 中科大计算机学院吴雨霏,刘敏 女 博导 计算技术研究所
- css3 烟 蚊香_如何使用纯CSS实现蚊香燃烧的效果(附源码)
- python在煤矿的用途-矿用非金属制品检测前处理方法研究
- 减肥期间早餐或者晚餐吃馒头包子可以吗?
- 2022最新魔方财务管理系统织音①号模板免费下载,智简魔方免费主题模板下载
- 5000元起家,40年4万倍!一个来自贫民窟的亿万富翁
- IEEE 802.15.4 CSMA-CA算法翻译(IEEE 802.15.4-2006 7.5.1.4 CSMA-CA algorithm)