Hacker's guide to Neural Networks - 6
阿新 • • 發佈:2022-02-12
最大流
#include<bits/stdc++.h> using namespace std; #define N 210 #define M 5010 #define INF 0x3f3f3f3f int n,m,S,T; vector<int>head,to,nxt,val; void join(int u,int v,int w) { nxt.push_back(head[u]); head[u]=to.size(); to.push_back(v); val.push_back(w); } int dep[N],cur[N]; queue<int>q; bool bfs(int s,int t) { memset(dep,0,sizeof(dep)); dep[s]=1; while(!q.empty()) q.pop(); q.push(s); while(!q.empty()) { int u=q.front();q.pop(); for(int i=head[u];i!=-1;i=nxt[i]) { if(val[i]&&!dep[to[i]]) { dep[to[i]]=dep[u]+1; q.push(to[i]); } } } return dep[t]; } int dfs(int u,int t,int f) { if(u==t) return f; int i; for(int i=cur[u];i!=-1;i=nxt[i]) { cur[u]=i; if(val[i]&&dep[to[i]]==dep[u]+1) { int tmp=dfs(to[i],t,min(f,val[i])); if(tmp>0) { val[i]-=tmp; val[i^1]+=tmp; return tmp; } } } return 0; } long long dinic() { long long res=0; while(bfs(S,T)) { for(int i=0;i<=head.size();++i) cur[i]=head[i]; while(int d=dfs(S,T,INF)) { res+=d; } } return res; } int main() { scanf("%d%d%d%d",&n,&m,&S,&T); head.resize(n+1,-1); for(int i=1;i<=m;++i) { int u,v,w; scanf("%d%d%d",&u,&v,&w); join(u,v,w); join(v,u,0); } long long ans=dinic(); printf("%lld",ans); return 0; }
費用流
然後另外注意,最大費用最大流就是對於最小費用最大流把邊上的費用取相反數,然後答案也取相反數就行。
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define N 5010 #define M 1000010 int n,m,S,T; int dis[N],cur[M]; bool vis[N]; vector<int>head,nxt,to,val,cost; int ret=0; void join(int u,int v,int w,int c) { nxt.push_back(head[u]); head[u]=to.size(); to.push_back(v); val.push_back(w); cost.push_back(c); } queue<int>q; bool spfa(int s,int t) { memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); vis[s]=1;q.push(s);dis[s]=0; while(!q.empty()) { int u=q.front();q.pop();vis[u]=0; for(int i=head[u];i!=-1;i=nxt[i]) { if(val[i]&&dis[to[i]]>dis[u]+cost[i]) { dis[to[i]]=dis[u]+cost[i]; if(!vis[to[i]]) { vis[to[i]]=1; q.push(to[i]); } } } } return dis[t]!=INF; } int dfs(int u,int t,int f) { if(u==S) memset(vis,0,sizeof(vis)); if(u==t) return f; vis[u]=1; for(int i=cur[u];i!=-1;i=nxt[i]) { cur[u]=i; if(!vis[to[i]]&&val[i]!=0&&dis[to[i]]==dis[u]+cost[i]) { int tmp=dfs(to[i],t,min(f,val[i])); if(tmp>0) { ret+=tmp*cost[i]; val[i]-=tmp; val[i^1]+=tmp; return tmp; } } } vis[u]=0; return 0; } int mcmf() { int ans=0; while(spfa(S,T)) { for(int i=0;i<=to.size();++i) cur[i]=head[i]; while(int d=dfs(S,T,INF)) { ans+=d; } } return ans; } int anss=0; int main() { scanf("%d%d%d%d",&n,&m,&S,&T); head.resize(2*m+2,-1); for(int i=1;i<=m;++i) { int u,v,w,c; scanf("%d%d%d%d",&u,&v,&w,&c); join(u,v,w,c); join(v,u,0,-c); } anss=mcmf(); printf("%d %d",anss,ret); return 0; }