1116: [POI2008]CLO|深度搜索

如果原图中所有的点的度都>=2 那么肯定有解

如果原图中存在一个点的入度为0 那么肯定无解

对于原图中入度为1的点那么他连的那条边方向肯定要指向他

然后我们删掉这条边看原图是否仍然能满足条件

怎么办,不会写?

直接暴力深搜就好啦

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<iostream>
#define T 2200020
#define lowbit(x) (x&(-x))
using namespace std;
int sc()
{
	int i=0;char c=getchar();
	while(c>'9'||c<'0')c=getchar();
	while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
	return i;
}
int head[T],nxt[2*T],lst[2*T],vis[T];
int d[T],n,m,tot;
void insert(int x,int y)
{
	d[y]++;
	lst[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
bool dfs(int x)
{
	bool flag=1;
	vis[x]=1;
	for(int i=head[x];i;i=nxt[i])
	    if(!vis[lst[i]])
	    {
		    d[lst[i]]--;
	    	if(!d[lst[i]])return 0;
		    if(d[lst[i]]==1)flag=dfs(lst[i]);
		    if(!flag)return 0;
		}
	return 1;
}	
int main()
{
	n=sc(),m=sc();
	for(int i=1;i<=m;i++)
	{
		int x=sc(),y=sc();
		insert(x,y);
		insert(y,x);
	}
	for(int i=1;i<=n;i++)
	    if(!vis[i]&&!d[i])
	    {
	    	puts("NIE");
	    	return 0;
	    }
	    else if(!vis[i]&&d[i]==1)
	    {
	    	if(!dfs(i))
	    	{
	    		puts("NIE");
	    		return 0;
	    	}
	    }
	puts("TAK");
	return 0;
}




你可能感兴趣的:(深度搜索)