写了个dinic,但是效率不尽人意,比ISAP慢了一倍也不止,可能还有待优化。
#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int inf=1<<30; void read(int &y) { y=0;char x=getchar(); while(x<‘0‘||x>‘9‘) x=getchar(); while(x>=‘0‘&&x<=‘9‘) { y=y*10+x-‘0‘; x=getchar(); } } int n,m,a,b,c,s,t,cnt=-1; int head[100005],dis[100005],f[100005]; struct edge { int u,v,w; }e[200005]; void add(int x,int y,int z) { e[++cnt].u=head[x]; e[cnt].v=y; e[cnt].w=z; head[x]=cnt; } int bfs() { memset(dis,0,sizeof(dis)); queue<int>q; q.push(s);dis[s]=1; while(!q.empty()) { int nxt=q.front();q.pop(); for(int i=head[nxt];i!=-1;i=e[i].u) { int tmp=e[i].v; if(e[i].w>0&&dis[tmp]==0) { dis[tmp]=dis[nxt]+1; q.push(tmp); } } } if(dis[t]==0) return 0; return 1; } int dfs(int x,int f) { if(x==t) return f; for(int i=head[x];i!=-1;i=e[i].u) { int nxt=e[i].v; if(dis[nxt]==dis[x]+1&&e[i].w!=0) { int d=dfs(nxt,min(f,e[i].w)); if(d>0) { e[i].w-=d;e[i^1].w+=d; return d; } } } return 0; } int dinic() { int ans=0; while(bfs()) ans+=dfs(s,inf); return ans; } int main() { read(n);read(m);read(s);read(t); memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++) { read(a);read(b);read(c); add(a,b,c); add(b,a,0); } printf("%d",dinic()); return 0; }