2 条题解

  • 1
    @ 2026-8-11 8:52:29

    题解传送门

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define N 10010
    int n,m,ans;
    vector<int>G[N];
    int vis[N],match[N];
    mt19937 rng;
    int dfs(int x){
    	shuffle(G[x].begin(),G[x].end(),rng);
    	vis[x]=1;
    	for(int y:G[x]){
    		if(!match[y]){
    			vis[y]=1;
    			match[y]=x;match[x]=y;
    			return 1;
    		}
    	}
    	for(int y:G[x]){
    		int z=match[y];
    		if(vis[z])continue;
    		match[x]=y;match[y]=x;match[z]=0;
    		if(dfs(z))return 1;
    		match[y]=z;match[z]=y;match[x]=0;
    	}
    	return 0;
    }
    signed main(){
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	random_device seed;
    	rng=mt19937(seed());
    	cin>>n>>m;
    	for(int i=1;i<=m;i++){
    		int x,y;cin>>x>>y;x++,y++;
    		G[x].push_back(y);G[y].push_back(x);
    	}
    	
    	for(int i=1;i<=n;i++)if(!match[i]){
    		memset(vis,0,sizeof(vis));
    		ans+=dfs(i);
    	}
    	
    	cout<<ans<<'\n';
    	memset(vis,0,sizeof(vis));
    	for(int i=1;i<=n;i++)if(!vis[i]&&match[i]){
    		cout<<i-1<<' '<<match[i]-1<<'\n';
    		vis[i]=1;vis[match[i]]=1;
    	}
    	
    	return 0;
    }
    
    • @ 2026-8-17 9:55:17

      是可以解決我們十五班學生匹配問題的算法!

一般图最大匹配(Matching on General Graph)

信息

ID
8174
时间
100ms
内存
1024MiB
难度
9
标签
递交数
19
已通过
4
上传者