P2762 太空飞行计划问题

P2762 太空飞行计划问题
如果我的钱全部都流过去了,那不就相当于没有挣钱吗

#include <bits/stdc++.h>
using namespace std;
const int inf=1e9;
const int N=155;
const int M=1e6+5;
int h[N],ne[M],e[M],w[M],tot=1;
void add(int from,int to,int wi) {
e[++tot]=to;
w[tot]=wi;
ne[tot]=h[from];
h[from]=tot;
}
int dep[N],cur[N];
int n,m,S,T;
bool bfs() {
for(int i=1;i<=n+m+2;i++)cur[i]=h[i],dep[i]=0;
queue<int>q;
q.push(S);
dep[S]=1;
while(!q.empty()) {
int now=q.front();
q.pop();
for(int i=h[now];i;i=ne[i]) {
int to=e[i];
if(w[i]>0&&dep[to]==0)
dep[to]=dep[now]+1,q.push(to);
}
}
return dep[T];
}
int dfs(int now,int sum) {
if(now==T)return sum;
int ans=0;
for(int i=cur[now];i&&sum;i=ne[i]) {
cur[now]=i;
int to=e[i];
if(w[i]>0&&dep[to]==dep[now]+1) {
int k=dfs(to,min(sum,w[i]));
if(k==0)dep[to]=0;
w[i]-=k;
w[i^1]+=k;
sum-=k;
ans+=k;
}
}
return ans;
}
int main() {
cin>>m>>n;
S=n+m+1,T=n+m+2;
int sum=0;
for(int i=1;i<=m;i++) {
int x;cin>>x;
sum+=x;
add(S,i,x);
add(i,S,0);
while(getchar()==' ') {
cin>>x;
add(i,x+m,inf);
add(x+m,i,0);
}
}
for(int i=1;i<=n;i++) {
int x;cin>>x;
add(i+m,T,x);
add(T,i+m,0);
}
int ans=0;
while(bfs())ans+=dfs(S,inf);
ans=sum-ans;
for(int i=1;i<=m;i++)if(dep[i])cout<<i<<' ';cout<<'\n';
for(int i=1;i<=n;i++)if(dep[i+m])cout<<i<<' ';cout<<'\n';
cout<<ans<<'\n';
return 0;
}
posted @   basicecho  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示