这个题可以被分为两部分
1.匈牙利算法(板子)
2.邻接表存图(好像这不能称为第二部分)
每一排能坐两个人,那就把一排拆成两个点,
用匈牙利算法求最大匹配
每个人都只想坐两排,说明每个人只会连四条边
如果不会匈牙利的请点这里
#include<bits/stdc++.h> using namespace std; const int N = 5100; int link[N]={0},cnt[N]={0},w[N][N]; bool used[N]; int ans=0,n; int x,y; bool find(int x) { for(int i=1;i<=cnt[x];i++) { if(!used[w[x][i]]) { used[w[x][i]]=true; if(!link[w[x][i]] || find(link[w[x][i]])) { link[w[x][i]]=x; return true; } } } return false; } void xyl() { for(int i=1;i<=n*2;i++) { memset(used,0,sizeof(used)); if(find(i)) ans++; } } int main() { cin>>n; for(int i=1;i<=n*2;i++) { cin>>x>>y; w[i][++cnt[i]]=x; w[i][++cnt[i]]=x+n; w[i][++cnt[i]]=y; w[i][++cnt[i]]=y+n; } xyl(); cout<<ans; return 0; }