#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;//三年竞赛一场空,不开long long见祖宗//typedef __int128 lll;#define print(i) cout << "debug: " << i << endl#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)#define mem(a, b) memset(a, b, sizeof(a))#define pb(a) push_back(a)#define x first#define y secondtypedef pair<int,int> pii;constdouble eps =1e-8;const ll mod =1e9+7;constint maxn =1e2+10, maxm =1e5;constint inf =0x3f3f3f3f;struct edge
{int ep, val, nex;}e[maxm];int head[maxn], tot;voidinit(){mem(head,-1), tot =0;}voidadd(int x,int y,int val){
e[tot]={y, val, head[x]}, head[x]= tot++;
e[tot]={x,0, head[y]}, head[y]= tot++;}int n, m, s, t;int depth[maxn], cur[maxn], q[maxn], vis[maxn];boolbfs(){int hh =0, tt =0; q[hh]= s;mem(depth,-1), depth[s]=1;
cur[s]= head[s];while(hh <= tt){int now = q[hh++];for(int i = head[now];~i; i = e[i].nex){int ep = e[i].ep;if(depth[ep]==-1&& e[i].val){
depth[ep]= depth[now]+1;
cur[ep]= head[ep];if(ep == t)returntrue;
q[++tt]= ep;}}}returnfalse;}intdfs(int now,int flow){if(now == t)return flow;int res =0;for(int i = cur[now];~i && flow; i = e[i].nex){
cur[now]= i;int ep = e[i].ep;if(depth[ep]== depth[now]+1&& e[i].val){int k =dfs(ep,min(flow, e[i].val));if(!k) depth[ep]=-1;
e[i].val -= k, e[i ^1].val += k;
res += k, flow -= k;}}return res;}intdinic(){int res =0;while(bfs())
res +=dfs(s, inf);return res;}voiddfs(int now){
vis[now]=1;for(int i = head[now];~i; i = e[i].nex){int ep = e[i].ep;if(e[i].val &&!vis[ep])dfs(ep);}}intmain(){init();
cin >> n >> m;getchar();
s =0, t = n + m +1;int sum =0;for(int i =1; i <= n; i++){
string str;getline(cin, str);
stringstream ssin(str);int val, x;
ssin >> val; sum += val;add(s, i, val);while(ssin >> x)add(i, x + n, inf);}for(int i =1; i <= m; i++){int x; cin >> x;add(i + n, t, x);}int res =dinic();dfs(s);
vector<int> ans;for(int i =1; i <= n; i++)if(vis[i])
ans.pb(i);for(int i =0; i < ans.size(); i++)printf("%d%c", ans[i], i == ans.size()-1?'\n':' ');
ans.clear();for(int i = n +1; i <= n + m; i++)if(vis[i])
ans.pb(i - n);for(int i =0; i < ans.size(); i++)printf("%d%c", ans[i], i == ans.size()-1?'\n':' ');
cout << sum - res << endl;}
题目:acwing2176. 太空飞行计划问题分析:最大权闭合图的求解:s到正权点连边,容量为点权,负权点到t连边,容量为负权的绝对值,二分图中间的边(题目给的边),容量为inf最大权即为sum(正权) - dinic()闭合点集的求解跑一个dfs即可代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗//typedef __int128 l