您的位置:首页 > 其它

洛谷P2071 座位安排

2018-02-17 10:29 127 查看

题目背景

公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决。

题目描述

已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。

输入输出格式

输入格式:
第一行,一个正整数N。第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。输出格式:
一个非负整数,为最多使得多少人满意。

输入输出样例

输入样例#1: 
4
1 2
1 3
1 2
1 3
1 3
2 4
1 3
2 3
输出样例#1: 
7

说明

对于10%的数据 N≤10对于30%的数据 N≤50对于60%的数据 N≤200对于100%的数据 N≤2000算法提示:二分图的最大匹配
题目都说的那么明白了,于是:匈牙利大法好。。。注:我不知道是什么玄学原因,我的 dinic 炸了,于是。。。附代码:#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define MAXN 4010
using namespace std;
int n,ans=0,c=1,head[MAXN],f[MAXN];
bool vis[MAXN];
struct node{
int next,to;
}a[MAXN<<2];
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
inline void add(int x,int y){
a[c].to=y;
a[c].next=head[x];
head[x]=c++;
}
bool find(int x){
for(int i=head[x];i;i=a[i
e2f0
].next){
int v=a[i].to;
if(!vis[v]){
vis[v]=true;
if(f[v]==-1||find(f[v])){
f[v]=x;
return true;
}
}
}
return false;
}
int main(){
n=read()<<1;
memset(f,-1,sizeof(f));
memset(a,false,sizeof(a));
for(int i=1;i<=n;i++){
int x=read()<<1,y=read()<<1;
add(i,x-1);add(i,x);
add(i,y-1);add(i,y);
}
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
if(find(i))ans++;
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: