89pts WA on #2 求调
查看原帖
89pts WA on #2 求调
830990
roumeideclown楼主2025/6/30 14:29

RT

本地 (Ubuntu) 输出 10725\texttt{10725},答案为 10782\texttt{10782}

输入如下:

10
977 801 279 352 686 161 520 574 303 240 
630 883 296 389 27 973 313 501 693 112 
10
5 343 182 1 4 10 3 7 
1 770 982 8 
1 671 986 4 
6 618 689 3 2 7 8 9 5 
1 24 448 8 
3 110 596 6 9 3 
1 964 811 5 
3 479 890 5 6 10 
1 254 216 9 
2 141 108 6 1 

Code:

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
constexpr int INF=0x3f3f3f3f;
int n,m,s=10001,t=10002;
struct enode {
	int nxt,to,val;
} edge[1000005];
int tot=1,head[10005];
void add(int u,int v,int w) {
	edge[++tot]={head[u],v,w};
	head[u]=tot;
}
int dep[10005],now[10005];
bool bfs() {
	for(int i=1;i<=n+m;i++) dep[i]=INF;
	dep[t]=INF;
	dep[s]=0,now[s]=head[s];
	queue<int> q;q.push(s);
	while(!q.empty()) {
		int u=q.front();q.pop();
		for(int i=head[u];i;i=edge[i].nxt) {
			int v=edge[i].to,w=edge[i].val;
			if(dep[v]==INF&&w>0) {
				dep[v]=dep[u]+1;
				now[v]=head[v];
				if(v==t) return 1;
				q.push(v);
			}
		}
	}
	return 0;
}
int dfs(int u,int sum) {
	if(u==t) return sum;
	int k,flow=0;
	for(int i=now[u];i&&sum>0;i=edge[i].nxt) {
		now[u]=i;
		int v=edge[i].to,w=edge[i].val;
		if(dep[v]==dep[u]+1&&w>0) {
			k=dfs(v,min(w,sum));
			if(k==0) dep[v]=INF;
			edge[i].val-=k,edge[i^1].val+=k;
			sum-=k,flow+=k;
		}
	}
	return flow;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++) {
		int x;cin>>x;
		add(s,i,x);add(i,s,0);
		ans+=x;
	}
	for(int i=1;i<=n;i++) {
		int x;cin>>x;
		add(i,t,x);add(t,i,0);
		ans+=x;
	}
	cin>>m;
	for(int i=1;i<=m;i++) {
		int k,c1,c2;cin>>k>>c1>>c2;
		add(s,n+i,c1);add(n+i,s,0);
		add(n+i,t,c2);add(t,n+i,0);
		ans+=c1+c2;
		for(int j=1;j<=k;j++) {
			int x;cin>>x;
			add(n+i,x,INF);add(x,n+i,INF);
		}
	}
	while(bfs()) ans-=dfs(s,INF);
	cout<<ans<<"\n";
	return 0;
}

2025/6/30 14:29
加载中...