记录编号 587397 评测结果 AAAAAAAAAA
题目名称 寻找代表元 最终得分 100
用户昵称 GravatarUntitled 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2024-03-28 19:57:56 内存使用 1.91 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

int const N=410;
int n,m,res,f[N][N],level[N];
bool d[N];

struct node{
	int x,lvl;
};

bool bfs(int const Ed){
	memset(d,0,sizeof(d));
	memset(level,0,sizeof(level));
	queue<node> q;
	node t;
	int x,lvl;
	q.push(node{1,1});
	while (q.size()){
		t=q.front();q.pop();
		x=t.x,lvl=t.lvl;
		level[x]=lvl,d[x]=1;
		for (int y=1;y<=Ed;y++){
			if (x==y || d[y] || !f[x][y]) continue;
			q.push(node{y,lvl+1});
		}
	}
	return d[Ed];
}

int dfs(int x,int minn,int const Ed){
	if (x==Ed) return minn;
	int k,cnt=0;
	for (int y=1;y<=Ed;y++){
		if (x==y || level[y]<level[x] || !f[x][y]) continue;
		k=dfs(y,min(minn,f[x][y]),Ed);
		f[x][y]-=k,minn-=k,f[y][x]+=k,cnt+=k;
		if (!minn) break;
	}
	return cnt;
}

int main(){
	freopen("unique.in","r",stdin);
	freopen("unique.out","w",stdout);
	
	int a;
	scanf("%d %d",&n,&m);
	int const St=1,Np=1+n,Ed=2+n+m;
	for (int i=1;i<=n;i++) f[St][St+i]=1;
	for (int i=1;i<=m;i++) f[Np+i][Ed]=1;
	for (int i=1;i<=n;i++){
		while(scanf("%d",&a)){
			if (!a) break;
			f[St+i][Np+a]++;
		}
	}
	while (bfs(Ed)){
		res+=dfs(1,INT_MAX,Ed);
	}
	printf("%d",res);
	
	return 0;
}