codevs1222 信与信封的问题
二分图匹配。
先匹配一次,一定是完美匹配。然后枚举每条边,去掉它,若是不能完美匹配,这条边就必须。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
const int maxn=+;
int cnt,n,a[maxn][maxn],pre[maxn],vis[maxn],x,y;
using namespace std;
int find(int x) {
for(int i=;i<=n;i++)
if(a[x][i]&&!vis[i]) {
vis[i]=;
if(!pre[i]||find(pre[i])) {
pre[i]=x;
return ;
}
}
return ;
}
int main()
{ scanf("%d",&n);
for(int i=;i<=n;i++) for(int j=;j<=n;j++) a[i][j]=;
for(;;) {
scanf("%d%d",&x,&y);
if(x==&&y==) break;
a[x][y]=;
}
for(int i=;i<=n;i++) {
memset(vis,,sizeof(vis));
find(i);
}
for(int i=;i<=n;i++) {
int fl=;
for(int j=;j<=n;j++) if(a[i][j]){
a[i][j]=;
memset(vis,,sizeof(vis));
if(pre[j]==i) {
pre[j]=;
if(!find(i)){
printf("%d %d\n",i,j);
fl=; a[i][j]=; pre[j]=i;
break;}
//pre[j]=i;
}
a[i][j]=;
}
if(fl) cnt++;
}
if(cnt==n) cout<<"none"<<endl;
return ;
}
注意把边去掉后要加回去,pre去掉后若是没匹配上要加回去。
想起了之前轩神出的一道考题。侦探那题,若是删除某点后不能达到限制,则一定有该点。不是正解但是有人卡过了,不知道是数据水还是可以卡过。
codevs1222 信与信封的问题的更多相关文章
- codevs1222 信与信封问题
1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description John先生晚上写了n封信,并相应地写了 ...
- CODEVS1222 信与信封问题 (匈牙利算法)
先做一遍匈牙利算法.对于已经匹配的边,如果删去之后还能最大匹配数增加,则不符合要求. 一遍匈牙利算法是O(n^3)的,对于每一条边做n次,每次O(n^2),总的复杂度是O(n^3). 注意:不要忘记输 ...
- 信与信封问题(codevs 1222)
题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small Joh ...
- 【wikioi】1222 信与信封问题(二分图+特殊的技巧)
http://wikioi.com/problem/1222/ 一开始我就想到这样构图的,即可能的连边.但是似乎无法判断. 然后想来想去想不出来.. 题解: 同样是二分图,将可能的连边,然后跑一次最大 ...
- WIKIOI 1222信与信封问题
题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small Joh ...
- Codevs 1222 信与信封问题 二分图匹配,匈牙利算法
题目: http://codevs.cn/problem/1222/ 1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 ...
- codevs 1222 信与信封问题(二分图的完美匹配)
1222 信与信封问题 题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封. ...
- codevs 1222 信与信封问题
/* 二分图 题目给出的是确定不连通的边 如果我们拿剩下的可能联通也可能不连通的边跑最大匹配 如果不是完美非配 也就是说把所有可能的边都认为是一定的 这样都跑不出来(不能匹配到每个点)那么一定不能确定 ...
- FZU 1202 信与信封问题 二分图匹配
找匹配中的关键边. 做法: 拆掉一条匹配边,然后对边两边的点做一次增广,如果可以增广,那么此边不是关键边,否则是关键边. 详情可以参见:http://www.docin.com/p-109868135 ...
随机推荐
- 手机网站Meta的使用
meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. ...
- mysql安装总结
#mysql安装# 安装工具:yum -y install gcc-c++ ncurses cmake make ncurses-devel # 拷贝配置文件到指定目录:rm -rf /etc/my. ...
- Android代号、版本及API级别之间的对应关系
参考链接:Codenames, Tags, and Build Numbers | Android Open Source Project
- 前端常用的库和实用技术之JavaScript多线程
多线程概念: 多线程是指从软件或硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在 同一时间执行多于一个线程,进而提升整理处理性能.具有这种能力的系统包括对称多处理机,多核心 ...
- delphi 用户可以点击格式修改进行模板修改
过程 TlistRepAdd.Btn_GCListRepEditClick窗口 TlistRepAdd 补打流程单 1. 给用户权限 呈现出格式修改按钮 procedure TlistRepAdd.B ...
- [JZOJ1901] 【2010集训队出题】光棱坦克
题目 题目大意 给你个平面上的一堆点,问序列\({p_i}\)的个数. 满足\(y_{p_{i-1}}>y_{p_i}\)并且\(x_{p_i}\)在\(x_{p_i-1}\)和\(x_{p_i ...
- curl 一个使用例子
#include <iostream> #define Main main #include <string> #include <assert.h> #inclu ...
- 带撤销贪心——cf1148F好题
自己不会做,看了题解懂得 从最高位依次往低位遍历,因为偶数个1是不改变符号的,所以带个贪心即可(可以看成是带撤销的..) 每轮循环用sum记录该位选择1可以减少的值 如果是负数,就不要改成1 如果是正 ...
- Oracle连接字符串总结
Oracle XE 标准连接 Oracle XE(或者"Oracle Database 10g Express Edition")是一个简单免费发布的版本. 以下是语法格式: Dr ...
- flink提交文件出现java.io.IOException:unable to close file because the last block does not have enough number of replicas异常
当提交已经打包好的jar包时候,控制台出现以下的错误.