題意
/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個...