网络流水题,详细看代码

1 #include<bits/stdc++.h>
2 using namespace std;
3
4 int n,m,tot=-1,h[3005],ans=0,sum=0;
5 struct node{
6 int from,next,to,rest,full;
7 int last;
8 }e[100005];
9 void add(int x,int y,int z){
10 tot++;
11 e[tot].next=h[x];
12 h[x]=tot;
13 e[tot].from=x;
14 e[tot].to=y;
15 e[tot].rest=z;
16 e[tot].full=z;
17 }
18
19 int dis[3005],g[3005],flow[3005];
20 bool vis[3005];
21
22 int bfs(int s,int t){
23 queue<int>q;
24 dis[s]=0;
25 q.push(s);vis[s]=true;
26 while(!q.empty()){
27 int u=q.front();vis[u]=false;q.pop();
28 for(int i=h[u];i!=(-1);i=e[i].next){
29 if(dis[e[i].to]>dis[u]+1&&g[e[i].to]==(-1)&&e[i].rest>0){
30 g[e[i].to]=i;
31 flow[e[i].to]=min(flow[u],e[i].rest);
32 dis[e[i].to]=dis[u]+1;
33 if(vis[e[i].to]==false){
34 vis[e[i].to]=true;
35 q.push(e[i].to);
36 }
37 }
38 }
39 }
40 }
41
42 int EK(int s,int t){
43 while(1){
44 memset(vis,false,sizeof(vis));
45 memset(dis,0x7f,sizeof(dis));
46 memset(flow,0x7f,sizeof(flow));
47 memset(g,-1,sizeof(g));
48 bfs(s,t);
49 if(g[t]==(-1))return 0;
50 ans+=flow[t];
51 for(int p=t;p!=(s);p=e[g[p]].from){
52 e[g[p]].rest-=flow[t];
53 e[g[p]^1].rest+=flow[t];
54 }
55
56 }
57 }
58
59 int main(){
60 memset(h,-1,sizeof(h));
61 cin>>m>>n;
62 for(int i=1;i<=m;i++){
63 int co;cin>>co;sum+=co;
64 add(0,i,co);
65 add(i,0,0);
66 for(int j=1;j<=n;j++){
67 add(i,j+m,1);
68 add(j+m,i,0);
69 }
70 }
71 for(int i=1;i<=n;i++){
72 int co;cin>>co;
73 add(i+m,n+m+1,co);
74 add(n+m+1,i+m,0);
75 }
76 EK(0,n+m+1);
77 if(sum>ans){
78 cout<<0<<endl;
79 exit(0);
80 }
81 cout<<1<<endl;
82 for(int i=1;i<=m;i++){
83 for(int j=h[i];j!=(-1);j=e[j].next){
84 if(e[j].to!=0&&e[j].rest==0){
85 cout<<e[j].to-m<<" ";
86 }
87 }
88 cout<<endl;
89 }
90 }
来源:https://www.cnblogs.com/shatianming/p/12227600.html
