裸Dinic模板题,就不bb了,直接贴代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define MAXN 100000+10
#define oo 0x7ffffff
using namespace std;
int s=
0,t,n,m,cnt;
struct Line{
int cost,to,next;
}line[MAXN];
int head[MAXN],tail,level[MAXN],temp;
void add_line(
int from,
int to,
int fee){
tail++;line[tail].to=to;
line[tail].cost=fee;
line[tail].next=head[from];
head[from]=tail;
}
bool bfs(){
queue<int>q;
memset(level,
0xff,
sizeof(level));
q.push(s);
level[s]=
0;
while(!q.empty()){
int u=q.front();q.pop();
for(
int i=head[u];i;i=line[i].next){
int v=line[i].to;
if(level[v]==-
1&&line[i].cost>
0){
level[v]=level[u]+
1;
q.push(v);
}
}
}
if(level[t]==-
1)
return false;
else return true;
}
int dfs(
int u,
int maxflow){
if(u==t)
return maxflow;
for(
int i=head[u];i;i=line[i].next){
int v=line[i].to;
if(level[v]==level[u]+
1&&line[i].cost>
0){
int flow=dfs(v,min(maxflow,line[i].cost));
if(flow>
0){
line[i].cost-=flow;
line[i^
1].cost+=flow;
return flow;
}
}
}
return 0;
}
void print(){
for(
int i=
1;i<=m;i++){
for(
int j=head[i];j;j=line[j].next){
int v=line[j].to;
if(line[j].cost==
1&&line[j].to!=t)
printf(
"%d ",line[j].to-n);
}
printf(
"\n");
}
}
int main()
{
int n,m;
scanf(
"%d%d",&n,&m);
Init();
int sum =
0;
for(
int i =
1;i <= n;++i){
scanf(
"%d",&a[i]);
sum += a[i];
}
for(
int i =
1;i <= m;++i)
scanf(
"%d",&b[i]);
Build(n,m);
int flow = Maxflow();
if(flow>=sum){
puts(
"1");
Print(n,m);
}
else
puts(
"0");
return 0;
}
int main(){
freopen(
"in.txt",
"r",stdin);
scanf(
"%d%d",&m,&n);t=
0x7ff;
for(
int i=
1;i<=m;i++){
scanf(
"%d",&temp);
add_line(
0,i,temp);
add_line(i,
0,
0);
}
for(
int i=m+
1;i<=n+m;i++){
scanf(
"%d",&temp);
add_line(i,
0x7ff,temp);
add_line(
0x7ff,i,
0);
}
for(
int i=
1;i<=m;i++){
for(
int j=m+
1;j<=n+m;j++){
add_line(i,j,
1);
add_line(j,i,
0);
}
}
while(bfs())cnt+=dfs(s,oo);
cout<<cnt<<endl;
print();
return 0;
}