【NOIP模擬賽】列隊

在這裏插入圖片描述
這道題就很玄學了,我們將行看做一羣點集,把列又看做一羣點集,然後所謂的不好惹的同學就是該行和該列只能選一個,那麼我們將這兩個點連起來,然後呢就發現是一個二分圖的最大獨立集,然後呢用匈牙利算出最大點集然後呢剪一下就OK

#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
int vis[1005],a[1005];
set<int>mapa[1005];
int dfs(int x){
	for(set<int>::iterator it=mapa[x].begin();it!=mapa[x].end();it++){
		if(vis[*it]==0){
			vis[*it]=1;
			if(a[*it]==0||dfs(a[*it])){
				a[*it]=x;
				return 1;
			}
		}
	}
	return 0;
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		mapa[x].insert(y);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) vis[j]=0;
		if(dfs(i))ans++;
	}
	printf("%d",(2*n-ans)*n);
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章