zoukankan      html  css  js  c++  java
  • 最大流

    • 模板题们

        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呢

      

  • 相关阅读:
    第三方支付集成
    文件并发(日志处理)--队列--Redis+Log4Net
    ReportingServies——SQLServer报表开发综合实例
    C#开发可以可视化操作的windows服务
    4、ASP.NET MVC入门到精通——NHibernate构建一个ASP.NET MVC应用程序
    Lucene.net站内搜索—6、站内搜索第二版
    Lucene.net站内搜索—5、搜索引擎第一版实现
    Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
    谈谈爱情——祭奠那逝去的青春
    Lucene.net站内搜索—3、最简单搜索引擎代码
  • 原文地址:https://www.cnblogs.com/Ngshily/p/4984694.html
Copyright © 2011-2022 走看看