WIKIOI 1222信与信封问题

题目描述 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

题解:(摘抄)

典型的二分图最大匹配匈牙利算法

若完美匹配中一条边必须存在, 那如果删掉这条边就不会存在完美匹配

代码:

 1 var px,py:array[0..100] of longint;
 2     map:array[0..100,0..100] of boolean;
 3     i,n,op,t,x,y,ans:longint;
 4     vis:array[0..100] of longint;
 5     flag:boolean;
 6 function find(x:longint):boolean;
 7   var i:longint;
 8   begin
 9   for i:=1 to n do
10    if map[x,i] then
11     begin
12      if (vis[i]=t) then continue;
13      vis[i]:=t;
14      if (py[i]=0) or (find(py[i])) then
15       begin
16        py[i]:=x;
17        px[x]:=i;
18        exit(true);
19       end;
20     end;
21    exit(false);
22   end;
23 procedure init;
24  begin
25  readln(n);
26  readln(x,y);
27  fillchar(map,sizeof(map),true);
28  while (x<>0) and (y<>0) do
29   begin
30   map[x,y]:=false;
31   readln(x,y);
32   end;
33  end;
34 procedure main;
35  begin
36  for i:=1 to n do
37   begin
38   t:=i;
39   if (find(i)) then inc(ans);
40   end;
41  if ans<>n then writeln(‘none‘)
42  else
43   begin
44    flag:=false;
45    fillchar(vis,sizeof(vis),0);
46    for i:=1 to n do
47     begin
48      t:=i;
49      op:=px[i];
50      map[i,op]:=false;
51      py[op]:=0;px[i]:=0;
52      if not(find(i)) then
53       begin
54        writeln(i,‘ ‘,op);
55        px[i]:=op;
56        py[op]:=i;
57        flag:=true;
58        end;
59      map[i,op]:=true;
60      end;
61    if not(flag) then writeln(‘none‘);
62   end;
63  end;
64 begin
65  init;
66  main;
67 end.

WIKIOI 1222信与信封问题

时间: 2024-12-30 04:30:44

WIKIOI 1222信与信封问题的相关文章

codevs 1222 信与信封问题(二分图的完美匹配)

1222 信与信封问题 题目描述 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,尽可能多地将信正确地装回信封. 输入

codevs 1222 信与信封问题

/* 二分图 题目给出的是确定不连通的边 如果我们剩下的可能联通也可能不连通的 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 210 using namespace std; int n,num,head[maxn],g[maxn][maxn],ans,f[maxn],match[maxn],sum,ei; struct An

codevs1222 信与信封问题

1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封.不幸的是,Small John无法将拿出的信正确地装回信封中了. 将Small John所提供的n封信依次编号为1,2,…,n:且n个信封也依次编号为1,2,…,n.假定Small John能提供一组信息:第i封信肯

codevs1222 信与信封的问题

题目描述 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 Des

CODEVS1222 信与信封问题 (匈牙利算法)

先做一遍匈牙利算法.对于已经匹配的边,如果删去之后还能最大匹配数增加,则不符合要求. 一遍匈牙利算法是O(n^3)的,对于每一条边做n次,每次O(n^2),总的复杂度是O(n^3). 注意:不要忘记输出none. 1 var a:array[0..1000,0..1000] of boolean; 2 l,r:array[0..1000] of longint; 3 pd:array[0..1000] of boolean; 4 i,j,x,y,n,sum,num:longint; 5 func

codevs 必做:2776、1222

2776 寻找代表元 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号.广州二中苏元实验学校一共有m个人,分别用1到m编号.每个人可以参加一个或多个社团,也可以不参加任何社团.每个社团都需要选一个代表.谦哥希望更多的人能够成为代表. 输入描述 Input Description 第一行输入两个数n和m.以下n行每行若干个数,这些数都是不超过m的正整数.其中第i行的数表示社

小结:二分图匹配

概要: 可以用匈牙利或者网络流(听说Dinic是O(sqrt(V)*E),isap我不知道,大概一样吧.) 应用: 最大匹配.最小点覆盖.最大独立集.最小路径覆盖.二分图完美匹配等. 技巧及注意: 匈牙利是O(nm)的,比网络流慢. KM比网络流慢. (还是写网络流吧...) 在X集和Y集元素不同时,又要求哪些X集中元素有且只有一个Y集中的元素与之匹配时,可以先跑二分图匹配,然后依次删边,看是否还能继续匹配,如果不能就是一个答案.例如:[wikioi]1222 信与信封问题(二分图+特殊的技巧)

CodeVS 1697-⑨要写信

原题 题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因-- 琪露诺的符卡 冰符"Icicle Fall"-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪露诺放在了⑨的位置上,并以"⑨笨蛋"简单带过,从此"

第 7 章 门面模式【Facade Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,我们继续讲课.大家都是高智商的人,都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,然后把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的呀,信多了还是麻烦,比如到了情人节,为了大海捞针,给十个女孩子发情书,都要这样跑一遍,你不要累死,更别说你要发个广告信啥的,一下子发1 千万封邮件,那不就完蛋了?那怎么办呢?还好,现在邮局开发