匈牙利样例2错误求调
查看原帖
匈牙利样例2错误求调
999274
CNS_5t0_0r2楼主2024/8/1 19:51
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9,M = 1e5 + 9;
int n,m,tim;
int p[N],c[N];
struct Graph{
	struct edge{
		int to,nex;
	} e[(N + M) << 1];
	int head[N + M],ecnt;
	void addedge(int u,int v){
		ecnt++;
		e[ecnt] = (edge){v,head[u]};
		head[u] = ecnt;
	}
} G;
int vis[N + M];
int match[N + M];
bool dfs(int u){
	for(int i = G.head[u];~i;i = G.e[i].nex){
		int v = G.e[i].to;
		if(vis[v] == tim)
			continue;
		vis[v] = tim;
		if(!match[v] || dfs(match[v])){
			match[v] = u;
			return true;
		}
	}
	return false;
}
int d;
struct Query{
	int id,d;
} q[N];
int ans[N];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> m;
	for(int i = 0;i <= n;i++)
		G.head[i] = -1;
	for(int i = 1;i <= n;i++)
		cin >> p[i];
	for(int i = 1;i <= n;i++)
		cin >> c[i];
	cin >> d;
	for(int i = 1;i <= d;i++){
		cin >> q[i].d;
		q[i].id = i;
		vis[q[i].d] = -1;
	}
	for(int i = 1;i <= n;i++)
		if(vis[i] != -1){
			if(p[i] > m)
				continue;
			G.addedge(p[i],c[i] + m);
		} 
	reverse(q + 1,q + d + 1);
	tim = 0;
	for(int i = 1;i <= d;i++){
		for(;;tim++){
			if(!dfs(tim)){
		    	ans[q[i].id] = tim;
		    	break;
			}
		}
		if(p[q[i].d] > m)
			continue;
		G.addedge(p[q[i].d],c[q[i].d] + m);
	}
	for(int i = 1;i <= d;i++) 
		cout << ans[i] << '\n';
	return 0;
}
2024/8/1 19:51
加载中...