luogu P2071 座位安排 二分图最大匹配 双重的
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P2071 座位安排 二分图最大匹配 双重的相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<iomanip> #include<cstring> using namespace std; typedef long long ll; const int N=4004; int read() { int res=0,ch,flag=0; if((ch=getchar())==‘-‘) //判断正负 flag=1; else if(ch>=‘0‘&&ch<=‘9‘) //得到完整的数 res=ch-‘0‘; while((ch=getchar())>=‘0‘&&ch<=‘9‘) res=res*10+ch-‘0‘; return flag?-res:res; } int n,m; int result[N][2],use[N]; int e[N*16],ne[N*16],idx,h[N*16]; void add(int a,int b) { e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } bool dfs(int now) { for(int j=h[now]; ~j; j=ne[j]) { int v=e[j]; if(!use[v]) { use[v]++; if(!result[v][0]||dfs(result[v][0])) { result[v][0]=now; return true; } if(!result[v][1]||dfs(result[v][1])) { result[v][1]=now; return true; } } } return false; } int main() { memset(h,-1,sizeof h); n=read(); for(int i=1; i<=n*2; i++) { int a=read(),b=read(); add(i,a); add(i,b); } int ans=0; for(int i=1; i<=n*2; i++) { memset(use,0,sizeof(use)); if(dfs(i)) ans++; } cout<<ans<<endl; }
以上是关于luogu P2071 座位安排 二分图最大匹配 双重的的主要内容,如果未能解决你的问题,请参考以下文章