zoukankan      html  css  js  c++  java
  • spoj 962 IM

    因为是无向图,所以从1到2再到3等于从2到1和3。用拆点来限制流量(i,i+n,1),然后连接(s,2+n,1),(1,t,1),(3,t,1),对于原图中的边连接(x+n,y,1)(y+n,x,1),跑一遍dinic看答案是否为2即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=1000005,inf=1e9;
    int T,n,m,h[N],cnt,s,t,le[N];
    struct qwe
    {
    	int ne,to,va;
    }e[N];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void add(int u,int v,int w)
    {
    	cnt++;
    	e[cnt].ne=h[u];
    	e[cnt].to=v;
    	e[cnt].va=w;
    	h[u]=cnt;
    }
    void ins(int u,int v,int w)
    {//cout<<u<<" "<<v<<endl;
    	add(u,v,w);
    	add(v,u,0);
    }
    bool bfs()
    {
    	memset(le,0,sizeof(le));
    	queue<int>q;
    	le[s]=1;
    	q.push(s);
    	while(!q.empty())
    	{
    		int u=q.front();
    		q.pop();
    		for(int i=h[u];i;i=e[i].ne)
    			if(!le[e[i].to]&&e[i].va>0)
    			{
    				le[e[i].to]=le[u]+1;
    				q.push(e[i].to);
    			}
    	}
    	return le[t];
    }
    int dfs(int u,int f)
    {
    	if(u==t||!f)
    		return f;
    	int us=0;
    	for(int i=h[u];i&&us<f;i=e[i].ne)
    		if(le[e[i].to]==le[u]+1&&e[i].va>0)
    		{
    			int t=dfs(e[i].to,min(e[i].va,f-us));
    			e[i].va-=t;
    			e[i^1].va+=t;
    			us+=t;
    		}
    	return us;
    }
    int dinic()
    {
    	int re=0;
    	while(bfs())
    		re+=dfs(s,inf);
    	return re;
    }
    int main()
    {
    	T=read();
    	while(T--)
    	{
    		n=read(),m=read();
    		memset(h,0,sizeof(h));
    		s=0,t=2*n+1;cnt=1;
            ins(s,2+n,2);
            ins(1,t,1);
            ins(3,t,1);
            for(int i=4;i<=n;i++)
                ins(i,i+n,1);
    		for(int i=1;i<=m;i++)
    		{
    			int x=read(),y=read();
    			if(x<=0||y<=0||x>n||y>n)
    				continue;
    			ins(x+n,y,1);
    			ins(y+n,x,1);
    		}
    		/*
    		ins(s,2,2);
              ins(1+n,t,1);
    		ins(3+n,t,1);
    		for(int i=4;i<=n;i++)
               ins(i+n,i,1);
    		for(int i=1;i<=m;i++)
    		{
    			int x=read(),y=read();
    			if(x<=0||y<=0||x>n||y>n)
    				continue;
    			ins(x,y+n,1);
    			ins(y,x+n,1);
    		}
    		*/
    		if(dinic()==2)
    			puts("YES");
    		else
    			puts("NO");
    	}
    	return 0;
    }
    
  • 相关阅读:
    小故事
    设计模式
    git分支
    git简单操作
    ab命令压力测试
    libcheck ARM交叉编译
    libxml2 ARM 交叉编译
    I.MX6 安装LTIB
    为ARM编译Glib
    QT 4.8 中文显示问题
  • 原文地址:https://www.cnblogs.com/lokiii/p/8393869.html
Copyright © 2011-2022 走看看