zoukankan      html  css  js  c++  java
  • 【POJ 1459 power network】

    不可以理解的是,测评站上的0ms是怎么搞出来的。

    这一题在建立超级源点和超级汇点后就变得温和可爱了。其实它本身就温和可爱。对比了能够找到的题解:

    (1)艾德蒙·卡普算法(2)迪尼克算法(3)改进版艾德蒙·卡普算法(MY METHOD)

    不去管那个0ms的吧,那么(3)号算法最为美妙【它的别名是:ISAP】,时间可观。

    这个就算是一个ISAP的模板吧(除了输入的难看的几行外,其余均是标准的大米饼牌模板!)

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<queue>
     4 #include<cstring>
     5 #define go(i,a,b) for(int i=a;i<=b;i++)
     6 #define fo(i,a,x) for(int i=a[x],v=e[i].v;i>-1;i=e[i].next,v=e[i].v)
     7 #define mem(a,b) memset(a,b,sizeof(a))
     8 using namespace std;const int N=5000;
     9 struct E{int v,next,flow,cap;}e[N*N];
    10 int n,n_power,n_user,m,S,T,head[N],k=0,d[N];
    11 int num[N],cur[N],preE[N],preN[N];
    12 void ADD(int u,int v,int flow,int cap){e[k]=(E){v,head[u],flow,cap};head[u]=k++;}
    13 void BFS()
    14 {
    15     queue<int>q;bool vis[N]={0};q.push(T);d[T]=0;
    16     while(!q.empty())
    17     {
    18         int u=q.front();q.pop();
    19         fo(i,head,u)if(!e[i].cap&&!vis[v])
    20         vis[v]=1,d[v]=d[u]+1,q.push(v);    
    21     }
    22 }
    23 int aug(){int u,a=2147483645;
    24     u=T;while(u!=S){int i=preE[u];a=min(a,e[i].cap-e[i].flow);u=preN[u];}
    25     u=T;while(u!=S){int i=preE[u];e[i].flow+=a;e[i^1].flow-=a;u=preN[u];}return a;}
    26 int main(){while(~scanf("%d%d%d%d",&n,&n_power,&n_user,&m))
    27 {    
    28     S=0;T=n+1;char _;mem(head,-1);
    29     go(i,1,m){int u,v,cap;scanf(" %c%d%c%d%c%d",&_,&u,&_,&v,&_,&cap);
    30     u++,v++;ADD(u,v,0,cap);ADD(v,u,0,0);}
    31     go(i,1,n_power){int v,cap;scanf(" %c%d%c%d",&_,&v,&_,&cap);
    32     v++;ADD(S,v,0,cap);ADD(v,S,0,0);}
    33     go(i,1,n_user){int u,cap;scanf(" %c%d%c%d",&_,&u,&_,&cap);
    34     u++;ADD(u,T,0,cap);ADD(T,u,0,0);}BFS();mem(num,0);
    35         
    36     go(i,0,n+1)num[d[i]]++,cur[i]=head[i];
    37     int u=S,flow=0;
    38     while(d[S]<T+1)
    39     {
    40         u==T?flow+=aug(),u=S:1;bool retreat=1;
    41         fo(i,cur,u)    if(e[i].cap>e[i].flow&&d[u]==d[v]+1)
    42         {retreat=0;cur[u]=preE[v]=i;preN[v]=u;u=v;break;}
    43 
    44         if(!retreat)continue;
    45             
    46         int Min=T;fo(i,head,u){if(e[i].cap>e[i].flow)Min=min(Min,d[v]);}
    47         if(!(--num[d[u]]))break;num[d[u]=Min+1]++;
    48         cur[u]=head[u];u==S?1:u=preN[u];
    49     }
    50     printf("%d
    ",flow);
    51 }return 0;}//Paul_Guderian
    【改进版艾德蒙·卡普算法】

    网络流两个学习要点:学会转化问题,学会几个模型?你是在质疑神奇大米饼的权威吗?那就给你个大米饼!

    ZBH不给我玩以撒的结合…我写了这篇博客来表达愤怒!

  • 相关阅读:
    监听手机晃动(摇一摇)SensorEventListener
    adb logcat 命令行用法
    设计模式:观察者模式
    设计模式学习笔记-观察者模式
    Android中Parcelable序列化总结
    2048 Puzzle游戏攻略
    projecteuler----&gt;problem=14----Longest Collatz sequence
    桥模式设计模式进入Bridge
    SessionA和pplication网上聊天室的网络范例
    [ACM] hdu 5045 Contest (减少国家Dp)
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/6652663.html
Copyright © 2011-2022 走看看