題目描述 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個信封...