太空飞行计划问题
最大权闭合子图问题
ans=sum-maxflow
套路题
//Writer:jr HSZ;%%%WJMZBMR
#include<set>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N= 205,inf=0x7f7f7f7f;
int m,n,h[N],ecnt=1,head[N];
struct Edge {
int nxt,to,val;
} e[N<<1+3];
void add(int bg,int ed,int val) {
e[++ecnt].nxt=head[bg];
e[ecnt].to=ed;
e[ecnt].val=val;
head[bg]=ecnt;
}
bool bfs() {
memset(h,-1,sizeof h);
queue<int>q;
q.push(0);
h[0]=0;
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=head[u]; i; i=e[i].nxt) {
int v=e[i].to;
if(h[v]==-1&&e[i].val) {
h[v]=h[u]+1;
q.push(v);
}
}
}
return h[105]!=-1;
}
int dfs(int x,int f) {
if(x==105)return f;
int used=0,tp;
for(int i=head[x]; i; i=e[i].nxt) {
int v=e[i].to;
if(h[v]-1==h[x]&&e[i].val) {
tp=dfs(v,min(e[i].val,f-used));
used+=tp;
e[i].val-=tp;
e[i^1].val+=tp;
if(used==f)return f;
}
}
if(used==0)h[x]=-1;
return used;
}
int maxflow;
void dinic() {
maxflow=0;
while(bfs()) {
maxflow+=dfs(0,0x7f7f7f7f);
}
}
bool vis[N];
int a,b,c,ans;
int main() {
cin>>m>>n;
for(int i=1; i<=m; i++) {
scanf("%d",&a);
add(0,i,a);
add(i,0,0);
ans+=a;
char tools[10000];
memset(tools,0,sizeof tools);
cin.getline(tools,10000);
int ulen=0,tool;
while (sscanf(tools+ulen,"%d",&tool)==1) { //之前已经用scanf读完了赞助商同意支付该实验的费用
//tool是该实验所需仪器的其中一个
//这一行,你可以将读进来的编号进行储存、处理,如连边。
add(i,tool+m,inf);
add(tool+m,i,0);
if (tool==0)
ulen++;
else {
while (tool) {
tool/=10;
ulen++;
}
}
ulen++;
}
// while(~scanf("%d",&b)) {
// add(i,b+m,inf);
// add(b+m,i,0);
// }
}
for(int i=1; i<=n; i++) {
scanf("%d",&a);
add(i+m,105,a);
add(105,i+m,0);
}
dinic();
for(int i=1;i<=m;i++){
if(h[i]!=-1)cout<<i<<' ';
}
cout<<endl;
for(int i=1;i<=n;i++){
if(h[i+m]!=-1)cout<<i<<" ";
}
cout<<endl;
cout<<ans-maxflow;
return 0;
}
我是咸鱼。转载博客请征得博主同意Orz