luogu P2071 座位安排

这个题可以被分为两部分

1.匈牙利算法(板子)

2.邻接表存图(好像这不能称为第二部分)

每一排能坐两个人,那就把一排拆成两个点,

用匈牙利算法求最大匹配

每个人都只想坐两排,说明每个人只会连四条边

如果不会匈牙利的请点这里

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int link[N]={},cnt[N]={},w[N][N];
bool used[N];
int ans=,n;
int x,y;
bool find(int x)
{
for(int i=;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=;i<=n*;i++)
{
memset(used,,sizeof(used));
if(find(i))
ans++;
}
}
int main()
{
cin>>n;
for(int i=;i<=n*;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 ;
}
上一篇:关于 Apple Metal API 的一些想法


下一篇:分布式技术(下)-Redis&FastDFS&RabbitMQ