zoukankan      html  css  js  c++  java
  • [AYYZVijos1761]运输问题

    水水水……放一下模版就好了:

      1 /*
      2     P1761 运输问题
      3     一般增广路算法
      4     Author:GodCowC 
      5 */
      6 #include <iostream>
      7 #include <cstdio>
      8 #include <cctype>
      9 #include <cmath>
     10 #define MAXN 101
     11 #define INF 100000000
     12 using namespace std;
     13 int readint()                    
     14 {
     15     int ans=0;
     16     char c;
     17     while (!isdigit(c=getchar()));
     18     do
     19     {
     20         ans=ans*10+c-'0';
     21         c=getchar();    
     22     } while (isdigit(c));
     23     return ans;
     24 }
     25 int n;                                
     26 int s,t;                        
     27 struct Node                             
     28 {
     29     int pre;                    
     30     bool del;                    
     31     Node(int p=0,bool d=false):pre(p),del(d){}
     32 };
     33 struct Edge                        
     34 {
     35     int flow,cap;                
     36     Edge(int f=0,int c=0):flow(f),cap(c){}
     37 };
     38 Node argpath[MAXN];
     39 Edge graph[MAXN][MAXN];
     40 void init()
     41 {
     42     for (int i=1;i<=n;i++)
     43         argpath[i]=Node(0,0);
     44 }
     45 int find()
     46 {
     47     int i(s);
     48     while (i<=n && (!argpath[i].pre || argpath[i].del))
     49         i++;
     50     return (i>n?0:i);
     51 }
     52 bool ford(int& change)
     53 {
     54     init();
     55     argpath[s].pre=s;
     56     do
     57     {
     58         int i=find();
     59         if (!i)
     60             return true;
     61         for (int j=1;j<=n;j++)
     62         {
     63             if (argpath[j].pre)
     64                 continue;
     65             argpath[j].pre=(graph[i][j].flow<graph[i][j].cap?i:argpath[j].pre);
     66             argpath[j].pre=(graph[j][i].flow?-i:argpath[j].pre);
     67         }
     68         argpath[i].del=true;
     69     } while (!argpath[t].pre);
     70     int now=t;
     71     change=INF;
     72     do
     73     {
     74         int j=now;
     75         now=abs(argpath[j].pre);
     76         change=min(change,
     77             (argpath[j].pre<0?graph[j][now].flow:graph[now][j].cap-graph[now][j].flow));
     78     } while (now!=s);
     79     return false;
     80 }
     81 void fulkerson(int change)
     82 {
     83     int now=t;
     84     do
     85     {
     86         int j=now;
     87         now=abs(argpath[j].pre);
     88         if (argpath[j].pre<0)
     89             graph[j][now].flow-=change;
     90         else
     91             graph[now][j].flow+=change;
     92     } while (now!=s);
     93 }
     94 void putmaxflow()
     95 {
     96     int ans=0;
     97     for (int i=1;i<=n;i++)
     98         ans+=graph[i][t].flow;
     99     cout<<ans<<endl;
    100 }
    101 int main()
    102 {
    103     n=readint();
    104     s=1,t=n;
    105     for (int i=1;i<=n;i++)
    106         for (int j=1;j<=n;j++)
    107             graph[i][j]=Edge(0,readint());
    108     do
    109     {
    110         int change=0;                
    111         bool ok=ford(change);     
    112         if (ok)                    
    113         {
    114             putmaxflow();
    115             break;        
    116         }
    117         else
    118             fulkerson(change);
    119     } while (true);
    120     return 0;
    121 }
    一般增广路算法
      1 /*
      2     P1761 运输问题
      3     预流推进算法
      4     Author:GodCowC 
      5 */
      6 #include <iostream>
      7 #include <cstdio>
      8 #include <cctype>
      9 #include <cmath>
     10 #include <algorithm>
     11 #define MAXN 101
     12 #define INF 100000000
     13 using namespace std;
     14 int readint()                    
     15 {
     16     int ans=0;
     17     char c;
     18     while (!isdigit(c=getchar()));
     19     do
     20     {
     21         ans=ans*10+c-'0';
     22         c=getchar();    
     23     } while (isdigit(c));
     24     return ans;
     25 }
     26 int n,d[MAXN],e[MAXN],s,t;
     27 int c[MAXN][MAXN],p[MAXN][MAXN];
     28 int check()
     29 {
     30     int j=0;
     31     for (int i=2;i<n;i++)
     32         j+=e[i];
     33     return j;
     34 }
     35 int find()
     36 {
     37     for (int i=2;i<n;i++)
     38         if (e[i]!=0)
     39             return i;
     40 }
     41 int push(int x)
     42 {
     43     int i,j;
     44     for (i=1;i<=n;i++)
     45         if (d[x]==d[i]+1 && c[x][i]!=0)
     46             break;
     47     if (i<=n)
     48     {
     49         j=min(e[x],c[x][i]);
     50         e[x]-=j;
     51         c[x][i]-=j;
     52         if (i!=t)
     53             e[i]+=j;
     54         c[i][x]+=j;
     55     }
     56     else
     57         d[x]++;
     58     if (j==0)
     59         d[x]++;
     60     return 0;
     61 }
     62 int main()
     63 {
     64     int sum=0;
     65     n=readint();
     66     for (int i=1;i<=n;i++)
     67         for (int j=1;j<=n;j++)
     68             c[i][j]=readint();
     69     for (int i=1;i<=n;i++)
     70         for (int j=1;j<=n;j++)
     71         {
     72             if (c[i][j]>0)
     73                 p[i][j]=1;
     74             else if (i==j)
     75                 p[i][j]=0;
     76             else
     77                 p[i][j]=32767;
     78         }
     79     for (int k=1;k<=n;k++)
     80         for (int i=1;i<=n;i++)
     81             for (int j=1;j<=n;j++)
     82                     p[i][j]=min(p[i][j],p[i][k]+p[k][j]);
     83     s=1,t=n;
     84     for (int i=1;i<=n;i++)
     85         d[i]=p[i][t];
     86     for (int i=1;i<=n;i++)
     87     {
     88         e[i]=c[s][i];
     89         sum+=e[i];
     90         c[i][s]=c[s][i];
     91     }
     92     d[s]=n;
     93     while (check())
     94     {
     95         int i=find();
     96         push(i);
     97     }
     98     cout<<sum-e[s]<<endl;
     99     return 0;
    100 } 
    预流推进算法
  • 相关阅读:
    使用require.context引入模块
    npm link的使用
    mysql 链接远程数据库
    微信错误:errcode=45015, errmsg=response out of time limit or subscription is canceled
    微信公众号发送模板消息
    VS CODE 开发php实现断点调试
    uni 蓝牙 安卓 监听不到返回数据 不可写入
    vue3.0 兄弟组件传值
    二叉查找树的实现和删除
    模块二:ES新特性与TypeScript、JS性能优化
  • 原文地址:https://www.cnblogs.com/changke/p/5011476.html
Copyright © 2011-2022 走看看