TLE 76分求助

P2272 [ZJOI2007] 最大半连通子图

reclusive @ 2023-12-19 13:11:31

不知道为什么 1000 的点都跑不了,感觉复杂度没问题啊。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=1e6+5;
struct edge{
    int x,y,pre;
}a[2*M];
int last[N],alen;
void ins(int x,int y){
    a[++alen]=edge{x,y,last[x]};
    last[x]=alen;
}
int n,m,mod;
int f[N],g[N];
int rd[N];
vector<int>G[N];
int dfn[N],low[N],v[N],id;
int sta[N],top;
int c[N],siz[N],cnt;
void tarjan(int x){
    dfn[x]=low[x]=++id;v[x]=1;
    sta[++top]=x;
    for(int k=last[x];k;k=a[k].pre){
        int y=a[k].y;
        if(!dfn[y]){
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        else if(v[y]){
            low[x]=min(low[x],dfn[y]);
        }
    }
    if(dfn[x]==low[x]){
        cnt++;
        int y;
        do{
            y=sta[top--];
            v[y]=0;
            c[y]=cnt;
            siz[cnt]++;
        }while(y!=x);
    }
}
void dfs(int x){
    f[x]=siz[x];
    int mx=0;
    for(int y:G[x]){
        dfs(y);
        mx=max(mx,f[y]);
    }
    f[x]=f[x]+mx;
    if(!mx)g[x]=1;
    else g[x]=0;
    for(int y:G[x]){
        if(f[y]+siz[x]==f[x]){
            g[x]=(g[x]+g[y])%mod;
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&mod);
    alen=1;memset(last,0,sizeof(last));
    for(int i=1;i<=m;i++){
        int x,y;scanf("%d%d",&x,&y);
        ins(x,y);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i])tarjan(i);
    }
    for(int x=1;x<=n;x++){
        for(int k=last[x];k;k=a[k].pre){
            int y=a[k].y;
            if(c[x]==c[y])continue;
            rd[c[y]]++;
            if(find(G[c[x]].begin(),G[c[x]].end(),c[y])==G[c[x]].end()){
                G[c[x]].push_back(c[y]);
            }
        }
    }
    for(int i=1;i<=cnt;i++){
        if(!rd[i])dfs(i);
    }
    int mx=0,ans=0;
    for(int i=1;i<=cnt;i++){
        mx=max(mx,f[i]);
    }
    printf("%d\n",mx);
    for(int i=1;i<=cnt;i++){
        if(f[i]==mx){
            ans=(ans+g[i])%mod;
        }
    }
    printf("%d",ans);
    return 0;
}

by reclusive @ 2023-12-19 13:28:35

警示后人!!!这题不要用dfs!!!


|