?门芯初学图论1ms 遇到逆天问题 56pts
查看原帖
?门芯初学图论1ms 遇到逆天问题 56pts
534562
liheyang123楼主2025/1/17 16:50

record

为什么WA且仅WA on #1 #2 #3 #8?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll

inline int read() {
	int f = 1, x = 0;char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-')f = -1; ch = getchar(); }
	while(ch >= '0' && ch <= '9') {x = x * 10 + ch - 48; ch = getchar(); }
	return x * f;
}

const int N = 1e5 + 10;
const int M = 4e6 + 10;
const int AN94 = 1e9;

int S, T, ans;
int n, a[N], b[N], idn;
int m, c1[N], c2[N];
vector<int> v[N];
int idx, pre[N], cur[N];
int e[M], ne[M], val[M];
void add(int u, int v, int w){
	e[idx] = v, ne[idx] = pre[u], val[idx] = w;
	pre[u] = idx++;
}

int dep[N];

bool bfs(){
	memset(dep, -1, sizeof(dep));
	queue<int>q;
	q.push(S);
	dep[S] = 1;
	cur[S] = pre[S];
	while(!q.empty()){
		int p = q.front();
		q.pop();
		for(int i = pre[p]; ~i; i = ne[i]){
			int to = e[i];
			if(dep[to] == -1 && val[i]){
				dep[to] = dep[p] + 1;
				cur[to] = pre[to];
				if(to == T)return 1;
				q.push(to);
			}
		}
	}
	return 0;
}

int dfs(int x, int flw){
	if(x == T)return flw;
	int k = 0, res = 0;
	for(int i = cur[x]; ~i && flw; i = ne[i]){
		int to = e[i];
		cur[x] = i;
		if(dep[to] == dep[x] + 1 && val[i]){
			k = dfs(to, min(flw, val[i]));
			if(!k)cur[x] = -1;
			val[i] -= k;
			val[i ^ 1] += k;
			res += k;
			flw -= k;
		}
	}
	return res;
}

int dinic(){
	int tmp = 0, flw;
	while(bfs())
		while(flw = dfs(S, AN94))
			tmp+=flw;
	return tmp;
}

signed main(){
	memset(pre, -1, sizeof(pre));
	n = read();
	S = 0, T = 5 * n;
	for(int i = 1; i <= n; i++)a[i] = read();
	for(int i = 1; i <= n; i++)b[i] = read();
	m = read();
	for(int i = 1; i <= m; i++){
		int k = read();
		c1[i] = read(), c2[i] = read();
		for(int j = 1; j <= k; j++){
			int x = read();
			v[i].push_back(x); 
		}
		ans += c1[i] + c2[i];
	}
	for(int i = 1; i <= n; i++){
		add(S, i, a[i]);
		add(i, S, 0);
		add(i, T, b[i]);
		add(T, i, 0);
		ans += a[i] + b[i];
	}
	idn = n;
	for(int i = 1; i <= n; i++){
		idn++;
		add(S, idn, c1[i]);
		for(int j = 0; j < v[i].size(); j++){
			add(idn, v[i][j], AN94);
			add(v[i][j], idn, 0);
		}
		idn++;
		add(idn, T, c2[i]);
		for(int j = 0; j < v[i].size(); j++){
			add(v[i][j], idn, AN94);
			add(idn, v[i][j], 0);
		}
	}
	int res = dinic();
	cout<<ans - res;
	return 0;
}
2025/1/17 16:50
加载中...