比赛 |
202110省实验桐柏一中普及组联赛 |
评测结果 |
WWWWWWWWWW |
题目名称 |
分配同桌 |
最终得分 |
0 |
用户昵称 |
云浅 |
运行时间 |
0.003 s |
代码语言 |
C++ |
内存使用 |
10.49 MiB |
提交时间 |
2021-10-18 18:36:30 |
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int cnt=2;
int alist[6000001];
struct data{
int v;int next;int value;
}edge[6000001];
void add(int u,int v,int value){
edge[cnt].v=v;
edge[cnt].value=value;
edge[cnt].next=alist[u];
alist[u]=cnt++;
return ;
}
int h[1000001];
int q[1000001];
bool bfs(){
int x,next;
memset(h,-1,sizeof(h));
int head=0,tail=1;
q[head]=1;
h[1]=0;
while(head<tail){
x=q[head++];
next=alist[x];
while(next){
int v=edge[next].v;
int value=edge[next].value;
if(value&&h[v]<0){
q[tail++]=v;
h[v]=h[x]+1;
}
next=edge[next].next;
}
}
if(h[n]==-1) return false;
return true;
}
int ans;
int dfs(int x,int y){
if(x==n) return y;
int next=alist[x];
int w,used=0;
while(next){
int v=edge[next].v;
int value=edge[next].value;
if(value&&h[v]==h[x]+1){
w=y-used;
w=dfs(v,min(w,value));
edge[next].value-=w;
edge[next^1].value+=w;
used+=w;
if(used==y) return y;
}
next=edge[next].next;
}
if(!used) h[x]=-1;
return used;
}
void dinic(){
while(bfs()) ans+=dfs(1,0x7fffffff);
}
int n1,m1;
int main(){
freopen("tongzhuo.in","r",stdin);
freopen("tongzhuo.out","w",stdout);
cin>>n1>>m1;n1-=m1;swap(n1,m1);
n=n1+m1+2;
for(int i=1;i<=n1;i++){
add(1,i+1,1);
add(i+1,1,1);
}
int u,v;
while(cin>>u>>v){
add(u+1,v+1,1),add(v+1,u+1,1);
}
for(int i=1;i<=m1;i++){
add(i+1,n,1);
add(n,i+1,1);
}
dinic();cout<<ans<<endl;
return 0;
}