萌新求助QAQ

P2272 [ZJOI2007] 最大半连通子图

06ray @ 2018-08-01 08:40:39

72分,TLE两个点。 萌新刚会tarjan,求dalao指教。 错误代码:

// luogu-judger-enable-o2
#include <iostream> 
#include <vector>
#include <stack>
#include <queue>
#include <string>
#include <cstring>

using namespace std;

const int MAXN=1000100;

stack<int> s;

int n,m,x[MAXN],y[MAXN],dfn[MAXN],low[MAXN],color[MAXN],vis[MAXN],used[MAXN],in[MAXN],a[MAXN],to[MAXN],b[MAXN];
int colornum; 
vector<int> G[MAXN];
vector<int> G2[MAXN];
int f2[MAXN],f[MAXN];

int cnt,ans;
void tarjan(int u)
{
    cnt++;
    dfn[u]=low[u]=cnt;
    used[u]=true;
    s.push(u);
    vis[u]=true;
    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(vis[v])
            {
                low[u]=min(low[u],dfn[v]);
            }
        }
    }
    if(dfn[u]==low[u])
    {
        colornum++;
        while(s.top()!=u)
        {
            int t=s.top();
            s.pop();
            color[t]=colornum;
            vis[t]=false;
        }
        s.pop();
        color[u]=colornum;
        vis[u]=false;
    }
}
int k;
int dfs(int x)
{
    if(f[x]) return f[x];
    int sum=0,tot=0;
    for(int i=0; i<G2[x].size(); i++)
    {
        if(!used[G2[x][i]])
        {
            used[G2[x][i]]=true;
            int num=dfs(G2[x][i]);
            if(num>sum)
            {
                sum=num;
                tot=f2[G2[x][i]];
            }
            else if(num==sum)
            {
                tot+=f2[G2[x][i]];
            }
            tot%=k;
        }
    }
    f[x]=sum+a[x],f2[x]=tot;
    if(!tot) f2[x]=1;
    return f[x];
}
int main()
{
    int n,m=0;
    cin>>n>>m>>k;
    for(int i=1; i<=m; i++)
    {
        cin>>x[i]>>y[i];
        G[x[i]].push_back(y[i]);
    }
    for(int i=1; i<=n; i++)
    if(!used[i]) tarjan(i);
    for(int i=1; i<=n; i++)
    {
        a[color[i]]++;
    }
    for(int i=1; i<=m; i++)
    {
        if(color[x[i]]!=color[y[i]])
        {
            G2[color[x[i]]].push_back(color[y[i]]);
            in[color[x[i]]]++;
        }
    }
    for(int i=1; i<=colornum; i++)
    {
        memset(used,0,sizeof(used));
        if(!f[i]) dfs(i);
    }
    int ans2=0;
    for(int i=1; i<=colornum; i++)
    if(f[i]>ans)
    {
        ans=f[i];
        ans2=f2[i];
    }
    else if(f[i]==ans)
    {
        ans2+=f2[i];
        ans2%=k;
    }
    cout<<ans<<endl<<ans2;
    return 0;
}

by Kiel @ 2018-08-01 09:17:12

tql


|