求助tarjan超时
查看原帖
求助tarjan超时
389955
WillW_Chen楼主2023/7/29 16:20

不知道为什么TLE

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector>
#include<bitset>
#include<list>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<ctime>
#include<random>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MAXN=1e6+2;
const ll inf=0x3f3f3f3f;
int n,d,c,scc,tot;
stack<int>sta;
pair<int,int>ind[MAXN];
vector<int>g[MAXN];
vector<int>g2[MAXN];
int dfn[MAXN],low[MAXN],belong[MAXN];
int cnt[MAXN],f[MAXN];
void initialize(int k){
    scc=0;
    tot=0;
    while(sta.size()){
        sta.pop();
    }
    for(int i=1;i<=k;i++){
        g[i].clear();
        g2[i].clear();
        cnt[i]=0;
        f[i]=0;
        dfn[i]=0;
        low[i]=0;
        belong[i]=0;
    }
    return;
}
bool check(int start,int target){//从start能否跳到target
    int sx=ind[start].first;
    int sy=ind[start].second;
    int ex=ind[target].first;
    int ey=ind[target].second;
    if(ey>sy+d){
        return false;
    }
    int num=sy+d-ey;
    int r=sx+num;
    int l=sx-num;
    if(ex>=l&&ex<=r){
        return true;
    }
    return false;
}
void tarjan(int u){
    dfn[u]=low[u]=++tot;
    sta.push(u);
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(!belong[v]){
            low[u]=min(low[u],dfn[v]);
        }
    }
    if(dfn[u]==low[u]){
        int v=0;
        scc++;
        while(v!=u){
            v=sta.top();
            sta.pop();
            belong[v]=scc;
        }
    }
    return;
}
void dfs(int u){
    f[u]=cnt[u];
    int num=0;
    for(int i=0;i<g2[u].size();i++){
        int v=g2[u][i];
        dfs(v);
        num=max(num,f[v]);
    }
    f[u]+=num;
    return;
}
void solve(){
    cin>>n>>d>>c;
    initialize(n);
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        ind[i]=make_pair(x,y);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) continue;
            if(check(i,j)){
                g[i].push_back(j);
            }
        }
    }
    tarjan(c);
    for(int u=1;u<=n;u++){
        cnt[belong[u]]++;
        for(int i=0;i<g[u].size();i++){
            int v=g[u][i];
            if(belong[u]!=belong[v]){
                g2[belong[u]].push_back(belong[v]);
            }
        }
    }
    int s=belong[c];
    dfs(s);
    cout<<f[s]<<endl;
    return;
}

int main(){
    int T,tmp;
    cin>>T>>tmp;
    while(T--){
        solve();
    }
    return 0;
}
2023/7/29 16:20
加载中...