您的位置:首页 > 其它

codevs1222 信与信封的问题

2017-08-18 23:58 351 查看
一道二分图的变式

肯定啦先建反图

接着要想清楚,如果第i封信和第j个信封是唯一确定的,那么i到j这条边一定在这个二分图的最大匹配里

枚举删边,如果匹配情况有改变,则ans++

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define For(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int N=100+5;
int map

,cd
;
int n;
int vis
,w
,ww
;
inline int read(){
char c=getchar();
while(c<'0'||c>'9')c=getchar();
int x=c-'0';
c=getchar();
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x;
}
struct node{
int l;
int r;
}real
;
int compare(const node w1,const node w2){
return w1.l<w2.l;
}
int xiong_yali(int x){
For(i,1,n){
if(!map[x][i])continue;
if(vis[i])continue;
vis[i]=1;
if(w[i]==-1||xiong_yali(w[i])){
w[i]=x;
return 1;
}
}
return 0;
}
int timee;
int main(){
int x,y;
n=read();
For(i,1,n)
For(j,1,n)map[i][j]=1;
while(1){
x=read();y=read();
if(x==0)break;
map[x][y]=0;
}
int ans=0;
For(i,1,n)w[i]=-1;
For(i,1,n){
memset(vis,0,sizeof(vis));
ans+=xiong_yali(i);
}
For(i,1,n) ww[i]=w[i];
For(i,1,n){
if(ww[i]==-1)continue;
map[ww[i]][i]=0;
For(j,1,n)w[j]=-1;
int temp=0;
For(j,1,n){
memset(vis,0,sizeof(vis));
temp+=xiong_yali(j);
}
map[ww[i]][i]=1;
if(temp!=ans){real[++timee].l=ww[i];real[timee].r=i;}
}
sort(real+1,real+timee+1,compare);
For(i,1,timee)cout<<real[i].l<<" "<<real[i].r<<endl;
if(!timee)puts("none");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: