hdu3549(又是最大流模板题)
生活随笔
收集整理的這篇文章主要介紹了
hdu3549(又是最大流模板题)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
裸的最大流模板,比hdu1532多了個case輸出。。。
思路:
還是用hdu1532那個模板。。。
代碼:
#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 t;scanf("%d",&t);int cas=1;while(t--){int n,m;scanf("%d%d",&m,&n);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("Case %d: ",cas++);printf("%d\n",ans);}return 0; }總結(jié)
以上是生活随笔為你收集整理的hdu3549(又是最大流模板题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1532(最大流裸题)
- 下一篇: uvalive5092(找规律)