大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

匈牙利算法模板(洛谷3386)

#include<bits/stdc++.h>
using namespace std;

#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))

const int inf=0x3f3f3f3f,N=1000+10;

int n1,n2,m,vis[2*N],head[N<<1],match[N<<1],cnt=0;
struct edge{
	int nxt,v;
}e[N*N*2];

void add(int u,int v){
	e[cnt]=(edge){head[u],v};
	head[u]=cnt++;
}

bool dfs(int u){
	for(int i=head[u];i+1;i=e[i].nxt){
		int v=e[i].v;
		if(vis[v]) continue;
		vis[v]=1;//必须在此处标记,因为只会标记二分图的一侧 
		if(!match[v]||dfs(match[v])){
			match[v]=u;
			return 1;
		}
	}
	return 0;
}

int main(){
	//freopen("input.txt","r",stdin);
	mem(head,-1);
	read(n1),read(n2),read(m);
	int x,y,w,ans=0;
	go(i,1,m){
		read(x),read(y);
		if(x>n1||y>n2) continue;
		add(x,y+n1);
	}
	go(i,1,n1){
		mem(vis,0);
		ans+=dfs(i);
	}
	cout<<ans;
	return 0;
}
posted @ 2019-08-30 20:45  White_star  阅读(199)  评论(0编辑  收藏  举报
}