tarjan算法MLE了
查看原帖
tarjan算法MLE了
403799
Butane楼主2021/6/9 21:26

居然内存超限,绝了 本来还觉得能用tarjan直接秒了的

#include <bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;

const int maxv=12000;
const int maxNum=0x7fffffff;
const double PI=3.1415927;
const double eps=1e-6;
const int mod=1e9+7;
typedef long long LL;

vector<int> g[maxv];
int father[maxv],v[maxv];
vector<int> query[maxv],ans;
int n,r,m,a,b,tot,t=1,num;
LL cnt[maxv];
int getFa(int x){
    if(x==father[x]) return x;
    return father[x]=getFa(father[x]);
}
void addQuery(int x,int y,int id){
    query[x].push_back(y);
    query[y].push_back(x);
}
void tarjan(int x){
    v[x]=1;
    for(int i=0;i<g[x].size();i++){
        int y=g[x][i];
        if(v[y]) continue;
        tarjan(y),father[y]=x;
    }
    for(int i=0;i<query[x].size();i++){
        int y=query[x][i];
        if(v[y]==2){
            int lca=getFa(y);
            ans.push_back(lca);
        }
    }
    v[x]=2;
}
int main()
{
    scanf("%d %d %d",&n,&r,&m);
    for(int i=0;i<maxv;i++) father[i]=i;
    for(int i=1;i<=n-1;i++) scanf("%d %d",&a,&b),g[a].push_back(b),g[b].push_back(a);
    for(int i=1;i<=n;i++)
        for(int j=1;j<i;j++)
            addQuery(i,j,t++),addQuery(j,i,t++);
    tarjan(r);
    for(int i=0;i<ans.size();i++) cnt[ans[i]]++,cnt[ans[i]]%=mod;
    for(int i=1;i<=m;i++) scanf("%d",&num),printf("%lld\n",(cnt[num]+1)%mod);
    return 0;
}

2021/6/9 21:26
加载中...