SPOJ 962 网络流

来源:互联网 发布:ps软件源码下载 编辑:程序博客网 时间:2024/06/05 02:13

题目大意:有一个图,n个点,m条边。以1为起点,先到2,最后到3,且每个点最多只经过一次。问,能否有这样的路径。


最开始,我老是想着以1为起点,拆点十分麻烦。后来发现,只要以2为源点,1、3为汇点就好了。


这题值得吐槽的是,m似乎大于50011。输入的边的信息中的u,v。有的u、v似乎大于n,这些边是不要的........


//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<cmath>#include<cctype>#include<string>#include<algorithm>#include<iostream>#include<ctime>#include<map>#include<set>using namespace std;#define MP(x,y) make_pair((x),(y))#define PB(x) push_back(x)typedef long long LL;//typedef unsigned __int64 ULL;/* ****************** */const int INF=1000111222;const double INFF=1e100;const double eps=1e-8;const LL mod=1000000007;const int NN=30110*2;const int MM=401010;/* ****************** */struct G{    int v,cap,next;}E[MM+NN];int p[NN],T;int tp[NN],dd[NN],qw[NN];void add(int u,int v,int f){    E[T].v=v;    E[T].cap=1;    E[T].next=p[u];    p[u]=T++;    E[T].v=u;    E[T].cap=0;    E[T].next=p[v];    p[v]=T++;}bool find_path(int st,int en,int n){    int u,v,i,head,tail;    for(i=1;i<=n;i++)        dd[i]=-1;    qw[head=tail=0]=st;    dd[st]=0;    while(head<=tail)    {        u=qw[head++];        for(i=p[u];i+1;i=E[i].next)        {            v=E[i].v;            if(dd[v]==-1 && E[i].cap>0)            {                dd[v]=dd[u]+1;                qw[++tail]=v;            }        }    }    return (dd[en]!=-1);}int dfs_flow(int u,int &en,int f){    if(u==en || f==0)        return f;    int temp,flow=0;    for( ; tp[u]+1 ; tp[u]=E[ tp[u] ].next)    {        G &e=E[ tp[u] ];        if(dd[e.v]==dd[u]+1)        {            temp=dfs_flow(e.v,en,min(f,e.cap));            if(temp>0)            {                e.cap-=temp;                E[tp[u]^1].cap+=temp;                f-=temp;                flow+=temp;                if(f==0)                    break;            }        }    }    return flow;}int dinic(int st,int en,int n){    int i,ans=0;    while( find_path(st,en,n) )    {        for(i=1;i<=n;i++)            tp[i]=p[i];        ans+=dfs_flow(st,en,2);    }    return ans;}int main(){    int cas;    int n,m,u,v,i;    bool fg;    scanf("%d",&cas);    while(cas--)    {        memset(p,-1,sizeof(p));        T=0;        scanf("%d%d",&n,&m);/*        if(m>50011)        {            while(1);        }*/        while(m--)        {            scanf("%d%d",&u,&v);            if(u>n || v>n)                continue;            add(u+n,v,1);            add(v+n,u,1);        }        for(i=1;i<=n;i++)        {            add(i,i+n,1);        }        add(1+n,n+n+1,1);        add(3+n,n+n+1,1);        if(n>2 && dinic(2+n,n+n+1,n+n+1)>=2)            fg=true;        else            fg=false;        if(fg)            puts("YES");        else            puts("NO");    }    return 0;}


0 0