hdu1532(最大流裸题)
来源:互联网 发布:2017淘宝打折怎么设置 编辑:程序博客网 时间:2024/06/05 10:42
题意:
裸的最大流。
思路:
先试了一下红书模板,TLE了,想起来那个比较快的模板,直接就过了。。。果然模板的质量也是不一样的。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<queue>#include<stack>#include<set>#include<string>#include<vector>using namespace std;const int maxn = 510, maxm = maxn * maxn;const int inf = 1000000000;class MaxFlow//一个挺快的模板,比一般的MaxFlow快,我也不知道为什么。。。{private: int next[maxm*2]; int num[maxm*2]; int a[maxn*2]; int row_sum[maxn]; int col_sum[maxn]; int n , m, K; int d[maxn*2], st[maxn*2], cod[maxn][maxn]; int h[maxn*2], vh[maxn*2]; bool don[maxm*2],in[maxn*2]; int dfs(int, int); bool visit(int, int);public: int T; int r[maxm*2]; MaxFlow() {} int Addedge(int, int, int); int Run(); bool FindCircle(); void Init(int m) { memset(a, 0, sizeof(a)); tt = 1; T = m; } int tt; ~MaxFlow() {}} mf;int MaxFlow::Addedge(int x,int y,int rr){ next[++tt]=a[x]; num[tt]=y; r[tt]=rr; a[x]=tt; next[++tt]=a[y]; num[tt]=x; r[tt]=0; a[y]=tt; return tt;}int MaxFlow::dfs(int x,int y){ if (x==T) return y; int sig=st[x],minh=T+1; do { if (r[st[x]]) { if (h[num[st[x]]]+1==h[x]) { int k=dfs(num[st[x]],min(y,r[st[x]])); if (k) { r[st[x]]-=k; r[st[x]^1]+=k; return k; } } minh=min(minh,h[num[st[x]]]+1); if (h[0]>T) return 0; } st[x]=next[st[x]]; if (st[x]==0) st[x]=a[x]; } while (sig!=st[x]); if (vh[h[x]]--==0) h[0]=T+1; vh[h[x]=minh]++; return 0;}int MaxFlow::Run(){ for (int i=0; i<=T; i++) h[i]=vh[i]=0; for (int i=0; i<=T; i++) st[i]=a[i]; vh[0]=T+1; int ret=0; while (h[0]<=T) ret+=dfs(0,K+1); return ret;}bool MaxFlow::visit(int x,int ed){ if (don[ed]) return in[x]; don[ed]=true; in[x]=true; for (int p=a[x]; p; p=next[p]) { if (r[p] && (ed^p)!=1) if (visit(num[p],p)) return true; } in[x]=false; return false;}bool MaxFlow::FindCircle(){ for (int i=0; i<=T; i++) in[i]=false; for (int i=1; i<=tt; i++) don[i]=false; for (int i=2; i<=tt; i++) { if (r[i] && !don[i]) { in[num[i^1]]=true; if (visit(num[i],i)) return true; in[num[i^1]]=false; } } return false;}int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){int t=m;mf.Init(t);mf.Addedge(0,1,inf);for(int i=1;i<=n;i++){int s,t,c;scanf("%d%d%d",&s,&t,&c);mf.Addedge(s,t,c);}int ans=mf.Run();printf("%d\n",ans);} return 0;}
另附上红书TLE模板:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<queue>#include<stack>#include<set>#include<string>#include<vector>using namespace std;const int maxn = 510, maxm = maxn * maxn;const int inf = 1000000000;struct Edge{int v,f,nxt;};int n,src,sink;int g[maxn+10];int nume;Edge e[maxm*2+10];void addedge(int u,int v,int c){e[++nume].v=v;e[nume].f=c;e[nume].nxt=g[u];g[u]=nume;e[++nume].v=u;e[nume].f=0;e[nume].nxt=g[v];g[v]=nume;}void init(){memset(g,0,sizeof g);nume=1;}queue<int> que;bool vis[maxn+10];int dist[maxn+10];void bfs(){memset(dist ,0,sizeof dist);while(!que.empty())que.pop();vis[src]=true;que.push(src);while(!que.empty()){int u=que.front();que.pop();for(int i=g[u];i;i=e[i].nxt)if(e[i].f&&!vis[e[i].v]){que.push(e[i].v);dist[e[i].v]=dist[u]+1;vis[e[i].v]=true;}}}int dfs(int u,int delta){if(u==sink){return delta;}else {int ret=0;for(int i=g[u];delta&&i; i=e[i].nxt)if(e[i].f&&dist[e[i].v]==dist[u]+1){int dd=dfs(e[i].v,min(e[i].f,delta));e[i].f-=dd;e[i^1].f+=dd;ret+=dd;}return ret;}}int maxflow(){int ret=0;while(true){memset(vis,0,sizeof vis);bfs();if(!vis[sink])return ret;ret+=dfs(src,inf);}}int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){init();src=1;sink=m;for(int i=1;i<=n;i++){int s,t,c;scanf("%d%d%d",&s,&t,&c);addedge(s,t,c);}int ans=maxflow();printf("%d\n",ans);} return 0;}
0 0
- hdu1532(最大流裸题)
- hdu1532(最大流)
- 最大网络流--hdu1532
- HDU1532最大流入门
- 最大流模板 hdu1532
- HDU1532 Drainage Ditches 最大流
- hdu1532 最大流 EK算法
- HDU1532 Drainage Ditches 【最大流】
- hdu1532 网络流裸题
- hdu1532
- hdu1532
- hdu1532
- HDU1532 最大流-模板题
- hdu1532最大流EK与SAP算法
- HDU1532 Drainage Ditches【最大流】【Edmond-Karp】
- 【最大流之sap】【HDU1532】模板题
- HDU1532 Drainage Ditches(最大流)
- hdu1532 Drainage Ditches(最大流)
- matlab BPSK调制方式代码实现
- java-8大基本类型
- HDU 4288 Coder(vector + upper_bound, lower_bound)
- 如何在 Swift 中优雅地处理 JSON
- 移植APM代码之PID调节
- hdu1532(最大流裸题)
- 腾讯面试(二)
- 刷LeetCode感受
- Cmake的介绍和使用 Cmake实践
- spring事务注解
- CCF 201312-5 I’m stuck!(BFS)
- 腾讯面试(一)
- 正则表达式
- 关于卷积的一个血腥的讲解,看完给跪了