码迷,mamicode.com
首页 > 其他好文 > 详细

ISAP

时间:2015-05-23 22:33:44      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

跑的是比Dinic快辣。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=10000+10,maxm=80000+10,inf=-1u>>1;
11 struct ISAP{
12     struct Tedge{int x,y,w,next;}adj[maxm];int ms,fch[maxn];
13     int gap[maxn],cur[maxn],d[maxn],sta[maxn],n,t,top;
14     void init(int n){
15         this->n=n;ms=0;t=1;top=0;
16         memset(fch,-1,sizeof(fch));
17         memset(d,-1,sizeof(d));
18         return;
19     }
20     void AddEdge(int w,int v,int u){
21         adj[ms]=(Tedge){u,v,w,fch[u]};fch[u]=ms++;
22         adj[ms]=(Tedge){v,u,0,fch[v]};fch[v]=ms++;
23         return;
24     }
25     void bfs(){
26         queue<int>Q;Q.push(n);d[n]=0;
27         while(!Q.empty()){
28             int u=Q.front();Q.pop();
29             for(int i=fch[u];i!=-1;i=adj[i].next){
30                 int v=adj[i].y;
31                 if(d[v]==-1) d[v]=d[u]+1,Q.push(v);
32             }
33         } return;
34     }
35     int MaxFlow(){
36         bfs();int k=t,i,flow=0;
37         for(i=1;i<=n;i++) cur[i]=fch[i],gap[d[i]]++;
38         while(d[t]<n){
39             if(k==n){
40                 int mi=inf,pos;
41                 for(int i=0;i<top;i++) if(mi>adj[sta[i]].w) mi=adj[sta[i]].w,pos=i;
42                 for(int i=0;i<top;i++) adj[sta[i]].w-=mi,adj[sta[i]^1].w+=mi;
43                 flow+=mi;top=pos;k=adj[sta[top]].x;
44             }
45             for(i=cur[k];i!=-1;i=adj[i].next){
46                 int v=adj[i].y;
47                 if(adj[i].w&&d[k]==d[v]+1){cur[k]=i;k=v;sta[top++]=i;break;}
48             }
49             if(i==-1){
50                 int lim=n;
51                 for(int i=fch[k];i!=-1;i=adj[i].next){
52                     int v=adj[i].y;
53                     if(adj[i].w&&d[v]<lim) lim=d[v],cur[k]=i;
54                 } if(--gap[d[k]]==0) break;
55                 d[k]=lim+1;gap[d[k]]++;
56                 if(t!=k) k=adj[sta[--top]].x;
57             }
58         } return flow;
59     }
60 }sol;
61 inline int read(){
62     int x=0,sig=1;char ch=getchar();
63     while(!isdigit(ch)){if(ch==-)sig=-1;ch=getchar();}
64     while(isdigit(ch))x=10*x+ch-0,ch=getchar();
65     return x*=sig;
66 }
67 inline void write(int x){
68     if(x==0){putchar(0);return;}if(x<0)putchar(-),x=-x;
69     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
70     for(int i=len-1;i>=0;i--)putchar(buf[i]+0);return;
71 }
72 void init(){
73     int n=read(),m=read();sol.init(n);
74     for(int i=1;i<=m;i++) sol.AddEdge(read(),read(),read());
75     write(sol.MaxFlow());
76     return;
77 }
78 void work(){
79     return;
80 }
81 void print(){
82     return;
83 }
84 int main(){init();work();print();return 0;}

 

ISAP

标签:

原文地址:http://www.cnblogs.com/chxer/p/4525038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!