您的位置:首页 > 编程语言 > C语言/C++

【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas

2014-11-04 17:13 260 查看
∵每个座位可以坐俩人,所以拆点最大匹配。

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define N 2001
vector<int>G[N<<2];
typedef vector<int>::iterator ITER;
int mat[N<<2];
bool vis[N<<2];
int n,x,y;
bool dfs(int U)
{
for(ITER it=G[U].begin();it!=G[U].end();it++)
if(!vis[*it])
{
vis[*it]=1;
if(mat[*it]==-1||dfs(mat[*it]))
{
mat[*it]=U;
return 1;
}
}
return 0;
}
int max_match()
{
memset(mat,-1,sizeof(mat)); int res=0;
for(int i=1;i<=(n<<1);i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) res++;
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=(n<<1);i++)
{
scanf("%d%d",&x,&y);
G[i+(n<<1)].push_back(x);
G[i+(n<<1)].push_back(x+n);
G[i+(n<<1)].push_back(y);
G[i+(n<<1)].push_back(y+n);
G[x].push_back(i+(n<<1));
G[x+n].push_back(i+(n<<1));
G[y].push_back(i+(n<<1));
G[y+n].push_back(i+(n<<1));
}
printf("%d\n",max_match());
for(;;);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: