最大流Edmondes-Karp,hlpp代码(2007-04-16 19:49)

来源:互联网 发布:雅思词汇书哪本好 知乎 编辑:程序博客网 时间:2024/05/21 11:13
 

搞了一下午总算写出来了= =...

刚开始学网络流,也不知道要怎么样优化,贴上随便写的代码~继续搞rtf...

------------------------Edmondes-Karp--------------------------------

  1. #include "stdio.h"
  2. #include "string.h"
  3. int rm[201][201];
  4. int m,n;
  5. int que[201];
  6. int pre[201];
  7. int qnum,pos;
  8. char sta[201];
  9. int ans;
  10. int fpath(){
  11.           int i;
  12.           memset(pre,0,201);
  13.           memset(sta,0,201);
  14.           pos=0;
  15.           qnum=1;
  16.           que[0]=1;
  17.           sta[0]=1;
  18.           pre[0]=-1;
  19.           while(pos< qnum){
  20.                   for(i=1;i< =n;++i){
  21.                           if(rm[que[pos]][i]>0&&sta[i]==0){
  22.                                   que[qnum]=i;
  23.                                   pre[qnum]=pos;
  24.                                   if(i==n){
  25.                                           return qnum;
  26.                                   }
  27.                                   sta[i]=1;
  28.                                   ++qnum;
  29.                           }
  30.                   }
  31.                   ++pos;
  32.           }
  33.           return -1;
  34. }
  35. void add(int num){
  36.           int small=0x7fffffff;
  37.           int pos=num;
  38.           while(pre[pos]!=-1){
  39.                   if(rm[que[pre[pos]]][que[pos]]< small){
  40.                           small=rm[que[pre[pos]]][que[pos]];
  41.                   }
  42.                   pos=pre[pos];
  43.           }
  44.           pos=num;
  45.           ans+=small;
  46.           while(pre[pos]!=-1){
  47.                   rm[que[pre[pos]]][que[pos]]-=small;
  48.                   rm[que[pos]][que[pre[pos]]]+=small;
  49.                   pos=pre[pos];
  50.           }
  51. }
  52. int main()
  53. {
  54.           while(scanf("%d %d",&m,&n)!=EOF){
  55.                   memset(rm,0,201*201*4);
  56.                   int i;
  57.                   int s,d,r;
  58.                   for(i=0;i< m;++i){
  59.                           scanf("%d %d %d",&s,&d,&r);
  60.                           rm[s][d]+=r;
  61.                   }
  62.                   int tar;
  63.                   ans=0;
  64.                   while(1){
  65.                           tar=fpath();
  66.                           if(tar< 0){
  67.                                   break;
  68.                           }
  69.                           add(tar);
  70.                   }
  71.                   printf("%d/n",ans);
  72.           }
  73.           return 0;
  74. }

------------------------------hlpp------------------------------------

  1. #include "stdio.h"
  2. #include < queue>
  3. using namespace std;
  4. queue< int> que;
  5. int ori[201][201];
  6. int rm[201][201];
  7. int high[201];
  8. int e[201];
  9. int m,n;
  10. void init(){
  11.           memset(high,0,201*4);
  12.           memset(e,0,201*4);
  13.           while(!que.empty()){
  14.                   que.pop();
  15.           }
  16.           high[1]=n;
  17.           int i;
  18.           for(i=1;i< =n;++i){
  19.                   if(ori[1][i]>0){
  20.                           e[1]-=ori[1][i];
  21.                           e[i]+=ori[1][i];
  22.                           rm[1][i]=ori[1][i];
  23.                           rm[i][1]=-rm[1][i];
  24.                           que.push(i);
  25.                   }
  26.           }
  27. }
  28. int fpath(int num){
  29.           int i;
  30.           int small=0x7fffffff;
  31.           int spos;
  32.           for(i=1;i< =n;++i){
  33.                   if(ori[num][i]-rm[num][i]>0){                
  34.                           if(high[num]==high[i]+1){
  35.                                   return i;
  36.                           }
  37.                           if(high[i]< small){
  38.                                   small=high[i];
  39.                                   spos=i;
  40.                           }
  41.                   }
  42.           }
  43.           high[num]=small+1;
  44.           return spos;
  45. }
  46. void push(int s,int d){
  47.           int max=ori[s][d]-rm[s][d];
  48.           if(e[s]< max){
  49.                   max=e[s];
  50.           }
  51.           e[s]-=max;
  52.           e[d]+=max;
  53.           rm[s][d]+=max;
  54.           rm[d][s]=-rm[s][d];
  55. }
  56. void deal(){
  57.           int now;
  58.           int psta;
  59.           while(!que.empty()){
  60.                   now=que.front();
  61.                   que.pop();
  62.                   if(now==n){
  63.                           continue;
  64.                   }
  65.                   while(e[now]>0){
  66.                           psta=fpath(now);
  67.                           push(now,psta);
  68.                           que.push(psta);
  69.                   }
  70.           }
  71. }
  72. int main()
  73. {
  74.           while(scanf("%d %d",&m,&n)!=EOF){
  75.                   int i,s,d,r;
  76.                   memset(ori,0,201*201*4);
  77.                   memset(rm,0,201*201*4);
  78.                   for(i=0;i< m;++i){
  79.                           scanf("%d %d %d",&s,&d,&r);
  80.                           ori[s][d]+=r;
  81.                   }
  82.                   init();
  83.                   deal();
  84.                   printf("%d/n",e[n]);
  85.           }
  86.           return 0;
  87. }