思路
洛谷上额外要输出匹配方案,大家可以做一做,代码上注释了。
对每个问题进行二分图最大匹配,套一个匈牙利算法的模板,如果没有找到匹配,马上跳出。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2005;
struct E{
int next,to;
}e[maxn<<2];
int n,m,u,v,ans;
int head[maxn],cnt;
int match[maxn],mt[maxn],vis[maxn],idx;
inline void addedge(int from,int to){
e[++cnt].next=head[from];
e[cnt].to=to;
head[from]=cnt;
}
bool check(int x){
for(int i=head[x];i;i=e[i].next){
int to=e[i].to;
if(vis[to]!=idx){
vis[to]=idx;
if(!match[to]||check(match[to])){
match[to]=x;
//mt[x]=to; 记录匹配方案
return true;
}
}
}
return false;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
addedge(i,u+1);
addedge(i,v+1);
}
for(int i=1;i<=m;i++){
idx++; //时间戳
if(check(i)) ans++;
else break;
}
cout<<ans<<endl;
/*
for(int i=1;i<=ans;i++){
cout<<mt[i]-1<<endl;
}
*/
return 0;
} 
京公网安备 11010502036488号