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

2021-08-03 16:07:26 字數 1553 閱讀 3658

題目描述 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,盡可能多地將信正確地裝回信封。

輸入描述

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

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

輸出描述

輸出檔案的各行中每行有2個數i和j,表示第i封信肯定是裝在第j個信封中。請按信的編號i從小到大順序輸出。若不能確定正確裝入

信封的任何信件,則輸出「none」。

樣例輸入 3

1  2

1  3

2  1

0  0

樣例輸出

1   1

題意:告訴所有不能連的邊,求剩下之中一定可以配對的邊。看上去好像這道題有點詭異,其實就是匈牙利模板的乙個變式。

思路:輸入:開了乙個map陣列,存的是可以相連的邊(就是可能是配對的信與信封),map初值全部賦值為1,輸入i,j的就賦值map[i,j]為0,表示i信不會在j中。

處理:先判斷這個圖是不是乙個完美匹配(所有點都可以配對),如果不是完美匹配都可以直接輸出none,

然後搜尋所有的邊,刪除當前存在的邊,如果這條刪了就不是完美匹配,說明,這條邊的所連的i信是只有唯一的信封,即可以

確定此邊存在,如果刪了還是完美匹配,說明這條邊只是可能,不能確定它一定存在的

**如下

#include

#include

#include

#include

#include

#include

#define maxn 105

using namespace std;

int map[maxn][maxn];//資料範圍比較小,直接開鄰接矩陣

int num=0,vis[maxn],att[maxn];

int n,m;

int can(int x)

} }

return 0; }

int perfect()

memset(att,0,sizeof(att));

if(ans==n)return 1;

return 0; }

int main()

} int a=1,b=1;

while(a!=0&&b!=0)

if(perfect()==0)printf("none");//不是完美匹配直接輸出none

else

else

} } }

if(num==0)printf("none"); }

//noip水軍一名,初次發文,如有不妥,請各位大佬指出

codevs1222 信與信封的問題

一道二分圖的變式 肯定啦先建反圖 接著要想清楚,如果第i封信和第j個信封是唯一確定的,那麼i到j這條邊一定在這個二分圖的最大匹配裡 列舉刪邊,如果匹配情況有改變,則ans include include include include define for i,j,k for int i j i k...

信與信封問題

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

信與信封問題

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