#include <queue> #include <stdio.h> #include <string.h> #include<iostream> using namespace std; #define N 1005 #define M 40005 #define INF 0x7fffffff #define min(a,b) a < b ? a : b #define CLR(a,v) memset(a,v,sizeof(a)) struct Vertex { int head; }V[N]; struct Edge { int v,c,f,next; Edge(){} Edge(int v,int c,int f,int ne):v(v),c(c),f(f),next(ne){} }E[M]; int d[N],pre[N],cur[N],gap[N]; int top,s,t,n,m; void Init() { top = 0; CLR(V,-1); } void Add_edge(int u,int v,int c) { E[top] = Edge(v,c,0,V[u].head); V[u].head = top++; E[top] = Edge(u,0,0,V[v].head); V[v].head = top++; } void set_d() { queue<int> Q; CLR(d,-1); CLR(gap,0); d[t] = 0; Q.push(t); while(!Q.empty()) { int v = Q.front(); Q.pop(); ++gap[ d[v] ]; for(int i=V[v].head;i!=-1;i=E[i].next) { int u = E[i].v; // cout<<u<<endl; if(d[u] == -1) { d[u] = d[v]+1; Q.push(u); } } } } int Sap() { set_d(); //You can replace it with "CLR(d,0)" if you feel it trouble int MaxFlow = 0, u = s; int flow = INF;// cout<<s<<endl; // cout<<d[s]<<n<<endl; memcpy(cur,V,sizeof(V)); //current arc while(d[s] < n) { int &i = cur[u]; //reference for(;i!=-1;i=E[i].next) { int v = E[i].v; if(E[i].c > E[i].f && d[u] == d[v]+1) //admissible arc { u = v; pre[v] = i; flow = min(flow,E[i].c-E[i].f); ; if(u == t) { while(u != s) { int j = pre[u]; E[j].f += flow; E[j^1].f -= flow; u = E[j^1].v; } // cout<<flow<<endl; MaxFlow = max(MaxFlow,flow); flow = INF; } break; } } if(i == -1) //there's no admissible arc. { if(--gap[ d[u] ] == 0) break; int dmin = n-1; cur[u] = V[u].head; for(int j=V[u].head;j!=-1;j=E[j].next) if(E[j].c > E[j].f) //not full arc dmin = min(dmin,d[ E[j].v ]); d[u] = dmin+1; ++gap[ d[u] ]; if(u != s) u = E[ pre[u]^1 ].v; } } // cout<<MaxFlow<<endl; return MaxFlow; } char str[1008][100]; int cn; int fun(char a[]) { for(int i=1;i<=cn;i++) { if(strcmp(a,str[i]) == 0) return i; } strcpy(str[++cn],a); return cn; } int main() { int cas = 1; char a[1000],b[1000]; while(~scanf("%d%d",&n,&m),n||m) { int w; cn = 0; Init(); while(m--) { scanf("%s%s%d",a,b,&w); int x = fun(a); int y = fun(b); Add_edge(x,y,w); Add_edge(y,x,w); // cout<<x<<y<<endl; } scanf("%s%s",a,b); s = fun(a); t = fun(b); printf("Scenario #%d\n",cas++); printf("%d tons\n",Sap()); puts(""); } }
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define N 505#define inf 999999999using namespace std;int n,m,s,t,dis[N],pre[N],gap[N],flow[N][N];struct edge{int v,w;edge *next,*rev;edge(){next=0;}edge(int vv,int ww,edge *e){v=vv;w=ww;next=e;}}*adj[N],*path[N],*e;void insert(int u,int v,int w){edge *p=new edge(v,w,adj[u]);adj[u]=p;edge *q=new edge(u,0,adj[v]);adj[v]=q;p->rev=q;q->rev=p;}void bfs(){memset(dis,0x7f,sizeof(dis));memset(gap,0,sizeof(gap));queue<int> q;dis[t]=0;gap[0]=1;q.push(t);while(q.size()){int x=q.front();q.pop();for(e=adj[x];e;e=e->next){if(e->rev->w==0||dis[e->v]<t)continue;dis[e->v]=dis[x]+1;++gap[dis[e->v]];q.push(e->v);}}}int ISAP(){memset(dis,0,sizeof(dis));memset(gap,0,sizeof(gap));//bfs();int ans=0,u=s,d;while(dis[s]<=t){if(u==t){int minflow=-1u>>1;for(e=path[u];u!=s;e=path[u=pre[u]])minflow=min(minflow,e->w);for(e=path[u=t];u!=s;e=path[u=pre[u]]){e->w-=minflow;e->rev->w+=minflow;flow[pre[u]][u]+=minflow;flow[u][pre[u]]-=minflow;}ans+=minflow;}for(e=adj[u];e;e=e->next)if(e->w>0&&dis[u]==dis[e->v]+1)break;if(e){pre[e->v]=u;path[e->v]=e;u=e->v;}else{if(--gap[dis[u]]==0)break;for(d=t,e=adj[u];e;e=e->next)if(e->w>0)d=min(d,dis[e->v]);dis[u]=d+1;++gap[dis[u]];if(u!=s)u=pre[u];}}return ans;}int main(){int u,v,w;while(~scanf("%d%d",&m,&n)){memset(adj,0,sizeof(adj));while(m--){scanf("%d%d%d",&u,&v,&w);insert(u,v,w);//insert(v,u,w);//无向边}s=1;t=n;printf("%d\n",ISAP());}}
网络流
最新推荐文章于 2023-12-21 21:31:01 发布