求助后缀建图
查看原帖
求助后缀建图
251324
stntn楼主2022/8/2 08:16
#include<bits/stdc++.h>
#define N 4000010
#define LL long long
#define ULL unsigned long long
#define DB double
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define tep(i,u) for(int i=head[u];~i;i=e[i].nxt)
#define INF 0x3f3f3f3f3f3f3f
using namespace std;
template <typename T> inline void read(T &a)
{
	a=0;T w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){a=(a<<3)+(a<<1)+(ch^48);ch=getchar();}
	a*=w;
}
template <typename T,typename ...Args> inline void read(T &x,Args &...args){read(x);read(args...);}
int n,m,k,head[N],cc,a[N],dfn[N],low[N],color[N],colorcc,dfncc;
bool ins[N];
stack<int> s;
struct EDGE{int v,nxt;}e[N<<2];
inline void add_edge(int u,int v){e[++cc]={v,head[u]};head[u]=cc;}
inline void paint(int x){s.pop();color[x]=colorcc;ins[x]=0;}
inline void tarjan(int u)
{
	dfn[u]=low[u]=++dfncc;
	s.push(u);ins[u]=1;
	tep(i,u)
	{
		int v=e[i].v;
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(ins[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		colorcc++;
		while(s.top()^u) paint(s.top());
		paint(u);
	}
}
signed main()
{
	memset(head,-1,sizeof(head));
	read(n,m,k);
	rep(i,1,m)
	{
		int u,v;read(u,v);
		add_edge(u+n,v);add_edge(v+n,u);
	}
	rep(i,1,n) add_edge(i+2*n,i+n),add_edge(i+3*n,i+n);
	rep(i,1,k)
	{
		int w;read(w);
		rep(j,1,w) read(a[j]);
//		sort(a+1,a+1+w);//不知道为什么加了跑得更快但分更低 (但这不是关键,忽略就好)
		rep(j,1,w-1) add_edge(a[j+1]+2*n,a[j]+2*n);
		rep(j,2,w) add_edge(a[j-1]+3*n,a[j]+3*n);
		rep(j,2,w-1) add_edge(a[j],a[j-1]+2*n),add_edge(a[j],a[j+1]+3*n);
		add_edge(a[1],a[2]+3*n);add_edge(a[w],a[w-1]+2*n);
	}
	rep(i,1,4*n) if(!dfn[i]) tarjan(i);
	rep(i,1,n) if(color[i]==color[i+n]) return printf("NIE\n"),0;
	printf("TAK\n");
	return 0;
}
2022/8/2 08:16
加载中...