思路

洛谷上额外要输出匹配方案,大家可以做一做,代码上注释了。
对每个问题进行二分图最大匹配,套一个匈牙利算法的模板,如果没有找到匹配,马上跳出。

代码

#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;
}