求助 迷之TLE
查看原帖
求助 迷之TLE
295769
LiuXinru楼主2021/3/20 17:28

最后三个点 一直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;
}
2021/3/20 17:28
加载中...