如果原图中所有的点的度都>=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;
}