AcWing 379. 捉迷藏(最小路径点覆盖&&匈牙利算法)

AcWing 379. 捉迷藏(最小路径点覆盖&&匈牙利算法)_第1张图片

输入样例:

7 5
1 2
3 2
2 4
4 5
4 6

输出样例:

3
#include
using namespace std;
typedef long long ll;
const int N=220;
int n,m,t;
int d[N][N],vis[N];
int match[N];
bool find(int x){
	for(int i=1;i<=n;i++){
		if(d[x][i]&&!vis[i]){
			vis[i]=1;
			if(match[i]==0||find(match[i])){
				match[i]=x;
				return true;
			}
		}
	}
	return false;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		d[x][y]=1;
	}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				d[i][j]|=d[i][k]&d[k][j];
	int res=0;
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof vis);
		if(find(i)) res++;
	}
	cout<

你可能感兴趣的:(AcWing,算法,图论,深度优先,c++,二分图,匈牙利算法)