玄学problem求助
查看原帖
玄学problem求助
609565
OtterZ楼主2022/10/4 19:15
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e4+4,M=5e4+4;
int n,m,u[M],v[M],op[N],dp[N],in[N],sc=0;
vector<int>e[N],p[N];
int dfscnt=0,dfs[N],back[N],scc[N];
bool vis[N],atS[N];
inline void srh(int nk){
    if(vis[nk])return;
    dp[nk]=1;
    vis[nk]=true;
    for(int i=0;i<p[nk].size();i++){
        srh(p[nk][i]);
        dp[nk]+=dp[p[nk][i]];
    }
}
inline void top_sort(){
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=sc;i++)
        if(in[i]==0)
            srh(i);
    int sum=0;
    for(int i=1;i<=sc;i++){
        if(dp[i]==sc)
            sum+=op[i];
    }
    printf("%d\n",sum);
    return ;
}
class STACK{
    private:int ST[N],top=-1;
    public:
    void push(int num){ST[++top]=num;atS[num]=true;vis[num]=true;}
    int tp(){return top==-1?-1e9:ST[top];}
    void pop(){
        if(top!=-1){
            atS[ST[top]]=false;
            top--;
        }
    }
}s;
inline void tarjan(int nk){
    dfs[nk]=back[nk]=++dfscnt;
    s.push(nk);
    for(int i=0;i<e[nk].size();i++){
        if(!vis[e[nk][i]]){
            tarjan(e[nk][i]);
            back[nk]=min(back[nk],back[e[nk][i]]);
        }
        else if(atS[e[nk][i]]){
            back[nk]=min(back[nk],dfs[e[nk][i]]);
        }
    }
    if(dfs[nk]==back[nk]){
        sc++;
        op[sc]=1;
        while(s.tp()!=nk){
            scc[s.tp()]=sc;
            op[sc]++;
            s.pop();
        }
        scc[nk]=sc;
        s.pop();
    }
}
inline void add(int begin,int end){
    p[end].push_back(begin);
    in[begin]++;
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u[i],&v[i]);
        e[u[i]].push_back(v[i]);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i])tarjan(i);
    }
    for(int i=1;i<=m;i++){
        if(scc[u[i]]==scc[v[i]])continue;
        add(scc[u[i]],scc[v[i]]);
    }
    top_sort();
    return 0;
}

只有64分,改成

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e4+4,M=5e4+4;
int n,m,u[M],v[M],op[N],dp[N],in[N],sc=0;
vector<int>e[N],p[N];
int dfscnt=0,dfs[N],back[N],scc[N];
bool vis[N],atS[N];
inline void srh(int nk){
    if(vis[nk])return;
    dp[nk]=1;
    vis[nk]=true;
    for(int i=0;i<p[nk].size();i++){
        srh(p[nk][i]);
        dp[nk]+=dp[p[nk][i]];
    }
}
inline void top_sort(){
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=sc;i++)
        if(!vis[i])
            srh(i);
    int sum=0;
    for(int i=1;i<=sc;i++){
        if(dp[i]>=sc)
            sum+=op[i];
    }
    printf("%d\n",sum);
    return ;
}
class STACK{
    private:int ST[N],top=-1;
    public:
    void push(int num){ST[++top]=num;atS[num]=true;vis[num]=true;}
    int tp(){return top==-1?-1e9:ST[top];}
    void pop(){
        if(top!=-1){
            atS[ST[top]]=false;
            top--;
        }
    }
}s;
inline void tarjan(int nk){
    dfs[nk]=back[nk]=++dfscnt;
    s.push(nk);
    for(int i=0;i<e[nk].size();i++){
        if(!vis[e[nk][i]]){
            tarjan(e[nk][i]);
            back[nk]=min(back[nk],back[e[nk][i]]);
        }
        else if(atS[e[nk][i]]){
            back[nk]=min(back[nk],dfs[e[nk][i]]);
        }
    }
    if(dfs[nk]==back[nk]){
        sc++;
        op[sc]=1;
        while(s.tp()!=nk){
            scc[s.tp()]=sc;
            op[sc]++;
            s.pop();
        }
        scc[nk]=sc;
        s.pop();
    }
}
inline void add(int begin,int end){
    p[end].push_back(begin);
    in[begin]++;
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u[i],&v[i]);
        e[u[i]].push_back(v[i]);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i])tarjan(i);
    }
    for(int i=1;i<=m;i++){
        if(scc[u[i]]==scc[v[i]])continue;
        add(scc[u[i]],scc[v[i]]);
    }
    top_sort();
    return 0;
}

后为什么就AC了?

2022/10/4 19:15
加载中...