最后三个点 一直TLE 求助
#include<bits/stdc++.h>
using namespace std;
#define in long long
#define MOD 1000000007
#define sc scanf
#define inf 100000000000
const int N=4e5;
struct node
{
int t,next;
} edge[N];
int n,m,k,q;
int tot,head[N],a[N],fa[N];
bool vis[N],p[N];
void Init()
{
tot=0;
memset(p,false,sizeof(p));
memset(head,0,sizeof(head));
memset(vis,false,sizeof(vis));
}
void add(int f,int t)
{
tot++;
edge[tot].t=t;
edge[tot].next=head[f];
head[f]=tot;
}
int fin(int x)
{
if(fa[x]==x)
return fa[x];
else
return fa[x]=fin(fa[x]);
}
bool deal(int f)
{
for(int i=head[f]; i; i=edge[i].next)
{
int t=edge[i].t;
if(p[t]==false)
{
int x,y;
x=fin(t);
y=fin(f);
if(x!=y)
fa[x]=y;
}
}
}
void solve()
{
for(int i=1; i<=n; i++)
fa[i]=i;
p[a[1]]=false;
for(int i=1; i<=n; i++)
{
if(!p[i])
deal(i);
}
bool flag=false;
for(int i=2; i<=k; i++)
{
p[a[i]]=false;
deal(a[i]);
if(fin(a[i])!=fin(a[i-1]))
{
flag=true;
break;
}
}
if(flag)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
int main()
{
Init();
int x,y;
cin>>n>>m>>k>>q;
for(int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1; i<=q; i++)
{
for(int i=1; i<=k; i++)
{
sc("%d",&a[i]);
p[a[i]]=true;
}
solve();
}
return 0;
}