codevs2930填报志愿


测试数据和说好的不一样啊

怎么能不输出字典序最小的方案

写了那么仔细还看了好多遍  还是给坑WA了两次

在此深深对出题人(出数据人)表示深深的  鄙弃biqi


好了,,这是二分图匹配 

裸匈牙利  (貌似模板就是最好的说明了)


#include <cstring>
#include <cstdio>
#define cle(a,b) memset(a,b,sizeof a)
#define L(i,j,k) for(int i = j;i <= k;i++)
int n,m,k,t,ans;
int e[1001][5001];
int o[5001],vis[1001],match[1001];
void read () {
	scanf("%d",&n);
	L(i,1,n) {
		scanf("%d",&k);
		L(j,1,k)
			e[i][scanf("%d",&t),t] = 1;
	}
	scanf("%d",&m);
	L(i,1,m)
		o[scanf("%d",&t),t] = 1;
}
bool find (int u) {
	L(i,1,n) {
		if(e[i][u] && !vis[i]) {
			vis[i] = 1;
			if(!match[i] || find(match[i])) {
				match[i] = u;
				return 1;
			}
		}
	}
	return 0;
}
int main () {
	read();
	L(i,1,5000) {
		if(!o[i])
			continue;
		cle(vis,0);
		if(find(i))
			ans++;
	}
	printf("%d\n",ans);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值