最大流

  • 模板题们

    poj3469

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 #define maxm 450000
 7 #define maxn 20005
 8 #define inf 0x3f3f3f3f
 9 queue<int>Q;
10 int cnt,v[maxm<<1],Next[maxm<<1],w[maxm<<1],first[maxn],cur[maxn];
11 int SSS,TTT,dep[maxn];
12 void add(int st,int end,int val){
13     v[cnt]=end;w[cnt]=val;Next[cnt]=first[st];first[st]=cnt++;
14     v[cnt]=st;w[cnt]=0;Next[cnt]=first[end];first[end]=cnt++;
15 }
16 bool bfs(){
17     memset(dep,0,sizeof(dep));
18     dep[SSS]=1;
19     Q.push(SSS);
20     while(!Q.empty()){
21         int x=Q.front();Q.pop();
22         for(int e=first[x];e!=-1;e=Next[e]){
23             if(!dep[v[e]]&&w[e]>0){
24                 dep[v[e]]=dep[x]+1;
25                 Q.push(v[e]);
26             }
27         }
28     }
29     return dep[TTT];
30 }
31 int dfs(int x,int lim){
32     if(x==TTT)return lim;
33     int lim1=lim;
34     for(int e=cur[x];e!=-1;e=Next[e]){
35         if(dep[v[e]]==dep[x]+1&&w[e]>0){
36             int flow=dfs(v[e],min(w[e],lim));
37             cur[x]=e;    
38             w[e]-=flow;w[e^1]+=flow;
39             if((lim-=flow)<=0)break;
40         }
41     }
42     if(lim==lim1)dep[x]=0;
43     return lim1-lim;
44 }
45 int main(){
46     int n,m,a,b,c;
47     scanf("%d%d",&n,&m);
48     SSS=n+1;TTT=n+2;
49     memset(first,-1,sizeof(first));
50     for(int i=1;i<=n;i++){
51         scanf("%d%d",&a,&b);
52         add(SSS,i,a);add(i,TTT,b);
53     }
54     for(int i=1;i<=m;i++){
55         scanf("%d%d%d",&a,&b,&c);
56         add(a,b,c);add(b,a,c);
57     }
58     int ans=0;
59     while(bfs()){
60         memcpy(cur,first,sizeof(first));    
61         ans+=dfs(SSS,inf);
62     }
63     printf("%d
",ans);
64     return 0;
65 }
View Code

  学习了一个当前【胡】优化,发现其实刘as*hole的模板并没有用到呢~  

  之前以为prey老父亲给的模板里if(lim==lim1)dep[x]=0;就是当前弧优化,然而并不是的样子,,,原因是什么呢——因为加了cur之后变快啦lululu~

  • 百度搜索poj网络流小结,感觉get了什么了不起的技能

    poj1698

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<queue>
 5 #include<string.h>
 6 using namespace std;
 7 
 8 #define inf 0x3f3f3f3f
 9 #define maxn 7500
10 queue<int>Q;
11 int cnt,v[maxn<<1],w[maxn<<1],next[maxn<<1],first[maxn];
12 int T,SSS,TTT,dep[maxn],cur[maxn];
13 void clear(){
14     cnt=0;
15     memset(first,-1,sizeof(first));
16 }
17 void add(int st,int end,int val){
18     v[cnt]=end;w[cnt]=val;next[cnt]=first[st];first[st]=cnt++;
19     v[cnt]=st;w[cnt]=0;next[cnt]=first[end];first[end]=cnt++;
20 }
21 bool bfs(int sss){
22     memset(dep,0,sizeof(dep));
23     Q.push(sss);
24     dep[sss]=1;
25     while(!Q.empty()){
26         int x=Q.front();Q.pop();
27         for(int e=first[x];e!=-1;e=next[e]){
28             if(!dep[v[e]]&&w[e]>0){
29                 dep[v[e]]=dep[x]+1;
30                 Q.push(v[e]);
31             }
32         }
33     }
34     return dep[TTT];
35 }
36 int dfs(int sss,int lim){
37     if(sss==TTT)return lim;
38     int lim1=lim;
39     for(int e=cur[sss];e!=-1;e=next[e]){
40         if(dep[v[e]]==dep[sss]+1&&w[e]>0){
41             int flow=dfs(v[e],min(lim,w[e]));
42             cur[sss]=e;
43             w[e]-=flow;w[e^1]+=flow;
44             if((lim-=flow)<=0)break;
45         }
46     }
47     if(lim==lim1)dep[sss]=0;
48     return lim1-lim;
49 }
50 int main(){
51     freopen("1.in","r",stdin);
52     scanf("%d",&T);
53     while(T--){
54         int n,x,d,w,ww=0,sum=0,ans=0;
55         clear();
56         scanf("%d",&n);
57         SSS=0;
58         for(int i=1;i<=n;i++){
59             vector<int>yooo;
60             for(int j=1;j<=7;j++){
61                 scanf("%d",&x);
62                 if(x)yooo.push_back(j);
63             }
64             scanf("%d%d",&d,&w);
65             ww=max(ww,w);
66             sum+=d;add(SSS,i,d);
67             for(int j=1;j<=w;j++)
68                 for(int k=0;k<yooo.size();k++)
69                     add(i,n+(j-1)*7+yooo[k],1);
70         }
71         TTT=n+ww*7+1;
72         for(int i=n+1;i<TTT;i++)add(i,TTT,1);
73         while(bfs(SSS)){
74             memcpy(cur,first,sizeof(first));
75             ans+=dfs(SSS,inf);
76         }
77         if(ans==sum)printf("Yes
");
78         else printf("No
");
79     }
80     return 0;
81 }
View Code

  建图比较简单的一道题,数据范围算错,re了一发

    poj2112

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 
 7 #define inf 0x3f3f3f3f
 8 #define maxn 250
 9 #define maxm 100000
10 queue<int>Q;
11 int K,C,M,cnt;
12 int SSS,TTT,v[maxm<<1],w[maxm<<1],Next[maxm<<1],first[maxm],map[maxn][maxn],dep[maxn];
13 
14 void add(int st,int end,int val){
15     v[cnt]=end;w[cnt]=val;Next[cnt]=first[st];first[st]=cnt++;
16     v[cnt]=st;w[cnt]=0;Next[cnt]=first[end];first[end]=cnt++;
17 }
18 bool bfs(){
19     memset(dep,0,sizeof(dep));
20     dep[SSS]=1;
21     Q.push(SSS);
22     while(!Q.empty()){
23         int x=Q.front();Q.pop();
24         for(int e=first[x];e!=-1;e=Next[e]){
25             if(!dep[v[e]]&&w[e]){
26                 dep[v[e]]=dep[x]+1;
27                 Q.push(v[e]);
28             }
29         }
30     }
31     return dep[TTT];
32 }
33 int dfs(int x,int lim){
34     if(x==TTT)return lim;
35     int tmp=lim;
36     for(int e=first[x];e!=-1;e=Next[e]){
37         if(dep[v[e]]==dep[x]+1&&w[e]>0){
38             int flow=dfs(v[e],min(lim,w[e]));
39             w[e]-=flow;
40             w[e^1]+=flow;
41             if((lim-=flow)<=0)break;
42         }
43     }
44     if(lim==tmp)dep[x]=0;
45     return tmp-lim;
46 } 
47 int Dinic(){
48     int ans=0;
49     while(bfs())ans+=dfs(SSS,0x3f3f3f3f);
50     return ans;
51 }
52 void floyd(){
53      for(int k=1;k<=K+C;k++)
54         for(int i=1;i<=K+C;i++)
55             for(int j=1;j<=K+C;j++)
56                 map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
57 }
58 int main(){
59     scanf("%d%d%d",&K,&C,&M);
60     for(int i=1;i<=K+C;i++)
61         for(int j=1;j<=K+C;j++){
62             scanf("%d",&map[i][j]);
63             if(!map[i][j])map[i][j]=inf;
64         }
65     floyd();
66        SSS=0,TTT=K+C+1;
67        int l=inf,r=0;
68        for(int i=1;i<=K+C;i++)
69            for(int j=1;j<=K+C;j++){
70             l=min(l,map[i][j]);
71             r=max(r,map[i][j]);       
72         }
73     while(l<r){
74         int mid=(l+r)>>1;
75         memset(first,-1,sizeof(first));
76         cnt=0;
77         for(int i=K+1;i<=K+C;i++){
78             add(SSS,i,1);
79             for(int j=1;j<=K;j++)
80                 if(map[i][j]<=mid)add(i,j,1);
81         }
82         for(int i=1;i<=K;i++)add(i,TTT,M);
83         if(Dinic()<C)l=mid+1;
84         else r=mid;
85     }
86     printf("%d
",l);
87     return 0;
88 }
View Code

  第一道二分+网络流,感觉有点神,floyd最短路,然后二分最短时间,不满足时间的点之间不连边,最大流判断可行性

    poj1149

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<string.h>
 5 using namespace std;
 6 
 7 #define inf 0x3f3f3f3f
 8 #define maxn 105
 9 #define maxm 1005
10 #define maxe 10500
11 queue<int>Q;
12 int cnt,v[maxe<<1],w[maxe<<1],next[maxe<<1],first[maxn],cur[maxn];
13 int SSS,TTT,dep[maxn],pig[maxm],last[maxm];
14 
15 void add(int st,int end,int val){
16     v[cnt]=end;w[cnt]=val;next[cnt]=first[st];first[st]=cnt++;
17     v[cnt]=st;w[cnt]=0;next[cnt]=first[end];first[end]=cnt++;
18 }
19 bool bfs(){
20     memset(dep,0,sizeof(dep));
21     dep[SSS]=1;
22     Q.push(SSS);
23     while(!Q.empty()){
24         int x=Q.front();Q.pop();
25         for(int e=first[x];e!=-1;e=next[e]){
26             if(!dep[v[e]]&&w[e]>0){
27                 dep[v[e]]=dep[x]+1;
28                 Q.push(v[e]);
29             }
30         }
31     }
32     return dep[TTT];
33 }
34 int dfs(int x,int lim){
35     if(x==TTT)return lim;
36     int lim1=lim;
37     for(int e=cur[x];e!=-1;e=next[e]){
38         if(dep[v[e]]==dep[x]+1&&w[e]>0){
39             int flow=dfs(v[e],min(lim,w[e]));
40             cur[x]=e;
41             w[e]-=flow;w[e^1]+=flow;
42             if((lim-=flow)<=0)break;
43         }
44     }
45     if(lim==lim1)dep[x]=0;
46     return lim1-lim;
47 }
48 int main(){
49     freopen("1.in","r",stdin);
50     int n,m,a,b,x;
51     memset(first,-1,sizeof(first));
52     scanf("%d%d",&n,&m);
53     SSS=0,TTT=m+1;
54     for(int i=1;i<=n;i++)
55         scanf("%d",&pig[i]);
56     for(int i=1;i<=m;i++){
57         scanf("%d",&a);
58         int sum=0;
59         for(int j=1;j<=a;j++){
60             scanf("%d",&x);
61             if(!last[x])sum+=pig[x],last[x]=i;
62             else add(last[x],i,inf);
63         }
64         if(sum)add(SSS,i,sum);
65         scanf("%d",&b);
66         add(i,TTT,b);
67     }
68     int ans=0;
69     while(bfs()){
70         memcpy(cur,first,sizeof(first));
71         ans+=dfs(SSS,inf);
72     }
73     printf("%d
",ans);
74     return 0;
75 }
View Code

  建图有点6,然而不清真,就不具体写了。。。

  • 坑B题,,,太坑了,还没A呢

  

原文地址:https://www.cnblogs.com/Ngshily/p/4984694.html