当前位置: 首页 > news >正文

【wikioi】1222 信与信封问题(二分图+特殊的技巧)

http://wikioi.com/problem/1222/

一开始我就想到这样构图的,即可能的连边。但是似乎无法判断。

然后想来想去想不出来。。

题解:

同样是二分图,将可能的连边,然后跑一次最大匹配,如果能完美匹配,那么就可能有肯定的信与信封,否则输出none,这点是显然的。

然后我们来考虑如何找出肯定的。

那么一定是在最大匹配的基础上,假设我们删了一个匹配(u, v),u却能匹配(即还是完美匹配),说明u肯定不是一个答案。因为它不唯一

反之如果不能完美匹配,说明他就是一个答案。

在标记的时候记得标记回来(一开始我觉得写lx是多余的,但是后来发现,,答案要求是按信有序,,所以,你懂的。。)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

const int N=105;
bool del[N][N], vis[N];
int ly[N], lx[N], n;
const bool ifind(const int &x) {
	for1(y, 1, n) if(!del[x][y] && !vis[y]) {
		vis[y]=1;
		if(!ly[y] || ifind(ly[y])) {
			lx[x]=y;
			ly[y]=x;
			return true;
		}
	}
	return false;
}
int main() {
	read(n);
	int u, v, ans=0, flag=1;
	for(u=getint(), v=getint(); u&&v; u=getint(), v=getint()) del[u][v]=1;
	for1(i, 1, n) {
		CC(vis, 0);
		if(ifind(i)) ++ans;
	}
	if(ans!=n) puts("none");
	else {
		for1(i, 1, n) {
			v=lx[i];
			del[i][v]=1;
			ly[v]=0;
			CC(vis, 0);
			if(!ifind(i)) {
				printf("%d %d\n", i, v);
				flag=0; ly[v]=i;
			}
			del[i][v]=0;
		}
		if(flag) puts("none");
	}
	return 0;
}

 

 


 

 

题目描述 Description

John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出。但是,第二天John的儿子Small John将这n封信都拿出了信封。不幸的是,Small John无法将拿出的信正确地装回信封中了。

 

将Small John所提供的n封信依次编号为1,2,…,n;且n个信封也依次编号为1,2,…,n。假定Small John能提供一组信息:第i封信肯定不是装在信封j中。请编程帮助Small John,尽可能多地将信正确地装回信封。

 

输入描述 Input Description

n文件的第一行是一个整数n(n≤100)。信和信封依次编号为1,2,…,n。

n接下来的各行中每行有2个数i和j,表示第i封信肯定不是装在第j个信封中。文件最后一行是2个0,表示结束。

输出描述 Output Description

输出文件的各行中每行有2个数i和j,表示第i封信肯定是装在第j个信封中。请按信的编号i从小到大顺序输出。若不能确定正确装入信封的任何信件,则输出“none”。

样例输入 Sample Input

3

1  2

1  3

2  1

0  0

样例输出 Sample Output

1   1

数据范围及提示 Data Size & Hint

相关文章:

  • stm32之PWM
  • java容器---集合总结
  • 将 MySQL 集群放入 Docker 容器
  • 执行ssh-add时出现Could not open a connection
  • Deprecated: Function session_register() is deprec
  • jsp和jspf的关系
  • apk漏洞记录1:伪加密+设备管理器不可删+webview漏洞
  • 图像处理之基础---矩阵求逆实现
  • html+css小知识点
  • MFC之窗体改动工具栏编程状态栏编程程序启动画面
  • UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
  • SoftLayer®凭借Flex Images™消融物理与虚拟服务器之间的界线
  • 康动仪数据传输不成功可以用如下办法解决
  • 如何使用MSDN
  • JavaScript document 对象
  • ES6指北【2】—— 箭头函数
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Angular Elements 及其运作原理
  • Git初体验
  • Idea+maven+scala构建包并在spark on yarn 运行
  • java取消线程实例
  • Vue UI框架库开发介绍
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 关于 Cirru Editor 存储格式
  • 如何合理的规划jvm性能调优
  • 入口文件开始,分析Vue源码实现
  • 一些css基础学习笔记
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 进程与线程(三)——进程/线程间通信
  • #if #elif #endif
  • #每日一题合集#牛客JZ23-JZ33
  • (02)vite环境变量配置
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (转)Mysql的优化设置
  • (转)shell调试方法
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .CSS-hover 的解释
  • .Net CF下精确的计时器
  • .net2005怎么读string形的xml,不是xml文件。
  • @Pointcut 使用
  • [14]内置对象
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [c]统计数字
  • [cb]UIGrid+UIStretch的自适应
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [flask]http请求//获取请求体数据
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [Linux] Boot分区满了的处理方法 The volume boot has only 0 bytes disk space remaining
  • [Matlab有限元分析] 2.杆单元有限元分析
  • [Nginx]反向代理Node将3000端口访问转换成80端口