【洛谷】P2319 [HNOI2006] 超级英雄(伪-匈牙利算法)

#include
using namespace std;
#define int long long
const int N=8e3+10,M=1e5+10;
int h[N],e[M],ne[M],idx;
bool vis[N];
int res,match[N],n,m,ans[N];
void add(int a,int b) {
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool find(int t) {
	for(int i=h[t]; i!=-1; i=ne[i]) {
		int j=e[i];
		if(!vis[j]) {
			vis[j]=true;
			if(match[j]==0||find(match[j])) {
				match[j]=t,ans[t]=j;
				return true;
			}
		}
	}
	return false;
}
void solve() {
	cin>>n>>m;
	memset(h,-1,sizeof h);
	for(int i=1; i<=m; i++) {
		int a,b;
		cin>>a>>b;
		a++,b++;
		add(i,a),add(i,b);
	}
	for(int i=1; i<=m; i++) {
		memset(vis,false,sizeof vis);
		if(find(i)) res++;
		else break;
	}
	cout<>tt;
	while(tt--) solve();
	return 0;
}
//3#include
using namespace std;
#define int long long
const int N=8e3+10,M=1e5+10;
int h[N],e[M],ne[M],idx;
bool vis[N];
int res,match[N],n,m,ans[N];
void add(int a,int b) {
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool find(int t) {
	for(int i=h[t]; i!=-1; i=ne[i]) {
		int j=e[i];
		if(!vis[j]) {
			vis[j]=true;
			if(match[j]==0||find(match[j])) {
				match[j]=t,ans[t]=j;
				return true;
			}
		}
	}
	return false;
}
void solve() {
	cin>>n>>m;
	memset(h,-1,sizeof h);
	for(int i=1; i<=m; i++) {
		int a,b;
		cin>>a>>b;
		a++,b++;
		add(i,a),add(i,b);
	}
	for(int i=1; i<=m; i++) {
		memset(vis,false,sizeof vis);
		if(find(i)) res++;
		else break;
	}
	cout<>tt;
	while(tt--) solve();
	return 0;
}
//3

over~

你可能感兴趣的:(算法,二分图最大匹配,思维)