哎
打板子 调了\(2\)h 无语了
\(EdmondKarp+Dinic(Dinitz)\)
#include <set> #include <stack> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define reg register int #define isdigit(x) ('0' <= x&&x <= '9') template<typename T> inline T Read(T Type) { T x = 0,f = 1; char a = getchar(); while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();} while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();} return x * f; } const int MAXN = 10010,MAXM = 100010; int cnt,n,m,s,t,_ori[MAXN]; struct EDGE { int v,w,_nxt; EDGE() {v = w = _nxt = 0;} }edge[MAXM << 1]; inline void addedge(int u,int v,int w) { edge[++cnt]._nxt = _ori[u]; edge[cnt].v = v; edge[cnt].w = w; _ori[u] = cnt; } inline void add(int u,int v,int w) {addedge(u,v,w),addedge(v,u,0);} namespace EdmondKarp { const int inf = 0x7f7f7f7f; struct Path {int v,e;}pre[MAXN]; bool vis[MAXN]; inline bool Bfs(int s,int t) { memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); queue<int> q; q.push(s),vis[s] = 1; while(!q.empty()) { int v,tp = q.front();q.pop(); if(tp == t) return true; for(reg e = _ori[tp];e;e = edge[e]._nxt) if(!vis[v = edge[e].v]&&edge[e].w) { pre[v].v = tp,pre[v].e = e; if(v == t) return true; vis[v] = 1,q.push(v); } } return false; } inline int EK(int s,int t) { int ans = 0; while(Bfs(s,t)) { int flow_ = inf; for(reg i = t;i != s;flow_ = min(flow_,edge[pre[i].e].w),i = pre[i].v); for(reg i = t;i != s;edge[pre[i].e].w -= flow_,edge[pre[i].e ^ 1].w += flow_,i = pre[i].v); ans += flow_; } return ans; } } namespace Dinitz { const int inf = 0x7f7f7f7f; int depth[MAXN],fire[MAXN]; inline bool Bfs(int s,int t) { memset(depth,-1,sizeof(depth)); queue<int> q; q.push(s),depth[s] = 0; while(!q.empty()) { int v,tp = q.front();q.pop(); for(reg e = _ori[tp];e;e = edge[e]._nxt) if(depth[v = edge[e].v] == -1&&edge[e].w) depth[v] = depth[tp] + 1,q.push(v); } return (depth[t] != -1); } inline int dfs(int x,int t,int _flow) { if(x == t) return _flow; int v,flow_ = 0; for(reg e = fire[x];e;e = edge[e]._nxt) { fire[x] = e; if(depth[v = edge[e].v] == depth[x] + 1&&edge[e].w) { int flow = dfs(v,t,min(_flow,edge[e].w)); _flow -= flow,flow_ += flow; edge[e].w -= flow,edge[e ^ 1].w += flow; if(!_flow) break; } } if(!flow_) depth[x] = -1; return flow_; } inline int Dinic(int s,int t) { int ans = 0; while(Bfs(s,t)) { for(reg i = 1;i <= n;i++) fire[i] = _ori[i]; ans += dfs(s,t,inf); } return ans; } } int main() { cnt = 1; n = Read(1),m = Read(1),s = Read(1),t = Read(1); for(reg i = 1;i <= m;i++) { int u = Read(1),v = Read(1),w = Read(1); add(u,v,w); } int ans = Dinitz::Dinic(s,t); printf("%d",ans); return 0; }
#include <set> #include <stack> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define reg register int #define isdigit(x) ('0' <= x&&x <= '9') template<typename T> inline T Read(T Type) { T x = 0,f = 1; char a = getchar(); while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();} while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();} return x * f; } const int MAXN = 220,MAXM = 2010; int cnt,n,m,s,t,_ori[MAXN]; typedef long long ll; struct EDGE { int v,_nxt;ll w; EDGE() {v = w = _nxt = 0;} }edge[MAXM << 2]; inline void addedge(int u,int v,ll w) { edge[++cnt]._nxt = _ori[u]; edge[cnt].v = v; edge[cnt].w = w; _ori[u] = cnt; } inline void add(int u,int v,ll w) {addedge(u,v,w),addedge(v,u,0ll);} namespace EdmondKarp { const int inf = 0x7f7f7f7f; struct Path {int v,e;}pre[MAXN]; bool vis[MAXN]; inline bool Bfs(int s,int t) { memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); queue<int> q; q.push(s),vis[s] = 1; while(!q.empty()) { int v,tp = q.front();q.pop(); if(tp == t) return true; for(reg e = _ori[tp];e;e = edge[e]._nxt) if(!vis[v = edge[e].v]&&edge[e].w) { pre[v].v = tp,pre[v].e = e; if(v == t) return true; vis[v] = 1,q.push(v); } } return false; } inline ll EK(int s,int t) { ll ans = 0; while(Bfs(s,t)) { ll flow_ = inf; for(reg i = t;i != s;flow_ = min(flow_,edge[pre[i].e].w),i = pre[i].v); for(reg i = t;i != s;edge[pre[i].e].w -= flow_,edge[pre[i].e ^ 1].w += flow_,i = pre[i].v); ans += flow_; } return ans; } } int main() { cnt = 1; ll stu; n = Read(1),m = Read(1),stu = Read(1ll); for(reg i = 1;i <= m;i++) { int u = Read(1),v = Read(1),w = Read(1); add(u,v,w); } ll ans = EdmondKarp::EK(1,n); if(ans == 0) printf("Orz Ni Jinan Saint Cow!"); else printf("%lld %lld",ans,(stu / ans + (stu % ans?1:0))); return 0; }
P1345 [USACO5.4]奶牛的电信Telecowmunication
#include <set> #include <stack> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define reg register int #define isdigit(x) ('0' <= x&&x <= '9') template<typename T> inline T Read(T Type) { T x = 0,f = 1; char a = getchar(); while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();} while(isdigit(a)) {x = (x << 1) + (x << 3) + (a ^ '0');a = getchar();} return x * f; } const int MAXN = 220,MAXM = 2010; int cnt,n,m,s,t,_ori[MAXN]; typedef long long ll; struct EDGE { int v,_nxt;ll w; EDGE() {v = w = _nxt = 0;} }edge[MAXM << 2]; inline void addedge(int u,int v,ll w) { edge[++cnt]._nxt = _ori[u]; edge[cnt].v = v; edge[cnt].w = w; _ori[u] = cnt; } inline void add(int u,int v,ll w) {addedge(u,v,w),addedge(v,u,0ll);} const int inf = 0x7f7f7f7f; namespace EdmondKarp { struct Path {int v,e;}pre[MAXN]; bool vis[MAXN]; inline bool Bfs(int s,int t) { memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); queue<int> q; q.push(s),vis[s] = 1; while(!q.empty()) { int v,tp = q.front();q.pop(); if(tp == t) return true; for(reg e = _ori[tp];e;e = edge[e]._nxt) if(!vis[v = edge[e].v]&&edge[e].w) { pre[v].v = tp,pre[v].e = e; if(v == t) return true; vis[v] = 1,q.push(v); } } return false; } inline ll EK(int s,int t) { ll ans = 0; while(Bfs(s,t)) { ll flow_ = inf; for(reg i = t;i != s;flow_ = min(flow_,edge[pre[i].e].w),i = pre[i].v); for(reg i = t;i != s;edge[pre[i].e].w -= flow_,edge[pre[i].e ^ 1].w += flow_,i = pre[i].v); ans += flow_; } return ans; } } int main() { cnt = 1; n = Read(1),m = Read(1),s = Read(1),t = Read(1); for(reg i = 1;i <= n;i++) if(i == s||i == t) add(i,n + i,inf); else add(i,n + i,1); for(reg i = 1;i <= m;i++) { int u = Read(1),v = Read(1); add(u + n,v,inf),add(v + n,u,inf); } ll ans = EdmondKarp::EK(s,t); printf("%d",ans); return 0; }