zoukankan      html  css  js  c++  java
  • 网络最大流 复习

    打板子 调了(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;
    }
    

    例题P1343 地震逃生

    #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;
    }
    
  • 相关阅读:
    Oracle存储过程
    Oracle触发器
    Oracle伪列
    Oracle索引
    Oracle视图
    Oracle数据库链路
    异常处理之动手动脑
    四则运算自动出题之javaweb版
    继承与多态之动手动脑
    javaweb之添加学生信息
  • 原文地址:https://www.cnblogs.com/resftlmuttmotw/p/11868360.html
Copyright © 2011-2022 走看看