1. 程式人生 > >hdu1532(最大流裸題)

hdu1532(最大流裸題)

題意:

裸的最大流。

思路:

先試了一下紅書模板,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;
}