求助wa on #6 88pts
查看原帖
求助wa on #6 88pts
795344
crz_qwq楼主2025/2/2 12:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
vector<int>edge[N];
int a[N],b[N];
vector<pair<int,int> >vec;
int dfn[N],low[N],id,stk[N],top,ins[N];
int sz[N],fa[N],cnt;
int in[N],f[N],g[N];
void tarjan(int u)
{
    dfn[u]=low[u]=++id;
    stk[++top]=u,ins[u]=1;
    for(auto &v:edge[u])
    {
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(ins[v])
            low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        ++cnt;
        while(1)
        {
            int v=stk[top--];
            ins[v]=0;
            fa[v]=cnt;
            ++sz[cnt];
            if(u==v)
                break;
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,mod;
    cin>>n>>m>>mod;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        a[i]=u,b[i]=v;
        edge[u].emplace_back(v);
    }
    for(int i=1;i<=n;++i)
        if(!dfn[i])
            tarjan(i);
    for(int i=1;i<=n;++i)
        edge[i].clear();
    for(int i=1;i<=m;++i)
        if(fa[a[i]]!=fa[b[i]])vec.emplace_back(fa[a[i]],fa[b[i]]);
    sort(vec.begin(),vec.end());
    int tot=unique(vec.begin(),vec.end())-vec.begin();
    for(int i=0;i<tot;++i)
    {
        int u=vec[i].first,v=vec[i].second;
        edge[u].emplace_back(v);
        ++in[v];
    }
    queue<int>q;
    for(int i=1;i<=cnt;++i)
    {
        if(!in[i])
        {
            f[i]=sz[i];
            g[i]=1%mod;
            q.emplace(i);
        }
    }
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(auto &v:edge[u])
        {
            if(f[u]+sz[v]>f[v])
            {
                f[v]=f[u]+sz[v];
                g[v]=g[u]%mod;
            }
            else if(f[u]+sz[v]==f[v])
                (g[v]+=g[u])%mod;
            if(!--in[v])
                q.emplace(v);
        }
    }
    int ans=0,sum=0;
    for(int i=1;i<=cnt;++i)
    {
        
        if(f[i]>ans)
        {
            ans=f[i];
            sum=g[i]%mod;
        }
        else if(f[i]==ans)
            sum=(sum+g[i])%mod;
    }
    cout<<ans<<'\n'<<sum%mod;
}
2025/2/2 12:12
加载中...