跑的是比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;}
搜索
复制
时间: 2024-10-15 08:12:39