信與信封問題

2021-07-13 21:04:28 字數 1829 閱讀 9486

題意

/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:

第一行是乙個整數n(n≤100)。信和信封依次編號為1,2,…,n。

接下來的各行中每行有2個數i和j,表示第i封信肯定不是裝在第j個信封中。檔案最後一行是2個0,表示結束。  輸出

/output:

輸出的各行中每行有2個數i和j,表示第i封信肯定是裝在第j個信封中。請按信的編號i從小到大順序輸出。若不能確定正確裝入信封的任何信件,則輸出「none」。 題解

/solution:

水水的最大匹配。 **

/code:

var

n:longint;

ls:array[0..201]of longint;

v:array[0..201]of boolean;

a:array[0..201,0..201]of boolean;

function find(x:longint):boolean;

var i,k:longint;

begin

find:=true;

for i:=1 to n do

if not v[i] and a[x,i] then

begin

k:=ls[i]; ls[i]:=x;

v[i]:=true;

if (k=0) or find(k) then exit;

ls[i]:=k;

end;

find:=false;

end;

procedure main;

var t,i:longint;

f:boolean;

begin

f:=false;

fillchar(ls,sizeof(ls),0);

for i:=1 to n do

begin

fillchar(v,sizeof(v),false);

find(i);

end;

for i:=1 to n do

begin

t:=ls[i]; ls[i]:=0;

a[t,i]:=false;

fillchar(v,sizeof(v),false);

if not find(t) then

begin

ls[i]:=t;

writeln(i,' ',t);

f:=true;

end;

a[t,i]:=true;

end;

if not f then writeln('none');

end;

procedure init;

var i,x,y:longint;

begin

fillchar(a,sizeof(a),true);

readln(n);

repeat

readln(x,y);

a[y,x]:=false;

until x+y=0;

end;

begin

init;

main;

end.

信與信封問題

題目大意 john先生晚上寫了n封信,並相應地寫了n個信封將信裝好,準備寄出。但是,第二天john的兒子small john將這n封信都拿出了信封。不幸的是,small john無法將拿出的信正確地裝回信封中了。將small john所提供的n封信依次編號為1,2,n 且n個信封也依次編號為1,2,...

SSL P1331 信與信封問題

傳送門 我們可以在開始時把邊取反,讀入的是1 11,就置成0 00,讀入是0 00,就置成1 11,然後跑一邊匈牙利演算法,然後判斷是不是完美匹配,不是就直接輸出non enone none 第二步每次刪掉一條邊,判斷是不是完美匹配,不是就輸出這個兩個端點 第二步跑完之後沒有發現有乙個是可以輸出的,...

codevs1222 信與信封問題(匈牙利)

題目描述 description john先生晚上寫了n封信,並相應地寫了n個信封將信裝好,準備寄出。但是,第二天john的兒子small john將這n封信都拿出了信封。不幸的是,small john無法將拿出的信正確地裝回信封中了。將small john所提供的n封信依次編號為1,2,n 且n個...