小可爱求助qwq

P2272 [ZJOI2007] 最大半连通子图

Arcturus1350 @ 2018-07-31 19:48:20

5wa

一脸懵逼.jpg

要是帮忙解决的话,就把小可爱抱走吧qwq

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,x;
int ans;int sum;int scc;
int u,v;
struct data{
    int v;int next;
}edge[1000010],node[1000100];
int alist[100010];
int head[1000010];
int cnt;
void add(int u,int v)
{
    edge[++cnt].v=v;
    edge[cnt].next=alist[u];
    alist[u]=cnt;
    return ;
}
int d[1000010];
void ins(int u,int v)
{
    node[++cnt].v=v;
    node[cnt].next=head[u];
    head[u]=cnt;
    d[v]++;
    return ;
}
int dfn[1000010];int dfu;
int stack[1000010];int top;
int low[10000010];bool book[1000010];
int poi[1000010];int bel[10000010];
void tarjan(int x)
{
    low[x]=dfn[x]=++dfu;
    stack[++top]=x;
    book[x]=true;
    int next=alist[x];
    while(next)
    {
//      printf("%d %d\n",x,next);
        int v=edge[next].v;
        if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]);
        else if(book[v]) low[x]=min(low[x],dfn[v]);
        next=edge[next].next;
    }
    int now=0;
    if(low[x]==dfn[x])
    {
        scc++;
        while(now!=x)
        {
            now=stack[top],top--;
            book[now]=false;
            poi[scc]++;
            bel[now]=scc;
        }
    }
    return ;
}
void rebuilt()
{
    cnt=0;
    for(int i=1;i<=n;i++){
        int next=alist[i];
        while(next)
        {
            if(bel[i]!=bel[edge[next].v])
              ins(bel[i],bel[edge[next].v]);
//            printf("%d %d\n",bel[i],bel[edge[next].v]);
            next=edge[next].next;
        }
    }
    return ;
}

queue<int> q;
int f[100010];int g[100010];int dp[100010];
void dynamic()
{
    for(int i=1;i<=scc;i++){
        if(!d[i]) q.push(i);
        f[i]=poi[i],g[i]=1;
    }
    while(!q.empty())
    {
        int x=q.front();
        q.pop();int next=head[x];
        while(next)
        {
            d[node[next].v]--;
            if(!d[node[next].v]) q.push(node[next].v);
            if(dp[node[next].v==x])continue;
            if(f[x]+poi[node[next].v]>f[node[next].v]){
              f[node[next].v]=f[x]+poi[node[next].v];
              g[node[next].v]=g[x];
            }
            else if(f[x]+poi[node[next].v]==f[node[next].v]) 
              g[node[next].v]=(g[node[next].v]+g[x])%x;
            dp[node[next].v]=x;
            next=node[next].next;
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&x);
    for(int i=1;i<=m;i++) scanf("%d%d",&u,&v),add(u,v);
    for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
    rebuilt();dynamic();
    for(int i=1;i<=scc;i++)
      if(f[i]>ans) ans=f[i],sum=g[i];
      else if(f[i]==ans) sum=(sum+g[i])%x;
//  for(int i=1;i<=cnt;i++) printf("%d %d\n",node[i].v,node[i].next);
    printf("%d\n%d",ans,sum%x);
    return 0;
}

by 小粉兔 @ 2018-07-31 19:53:42

您好,请问您为什么要强调您是个小可爱呢?


by wzhy @ 2018-07-31 19:53:53

%%%


by 2017zc @ 2018-07-31 19:55:39

您好,请问您为什么要强调您是个小可爱呢?


by Jianyang @ 2018-07-31 19:57:03

您好,请问您为什么要强调您是个小可爱呢?


by Arcturus1350 @ 2018-07-31 19:57:33

@2017zc @小粉兔 因为本宝宝本来就是小可爱啊!!!(可爱即正义!)


by 小粉兔 @ 2018-07-31 19:58:11

初步看来边表没开够啊

还有DAG的重边没判掉


by 小粉兔 @ 2018-07-31 19:58:41

您是女孩子吗 是的话我考虑一下继续帮


by 小粉兔 @ 2018-07-31 19:59:55

骗你的 我有女朋友了 为什么要帮你

23333333333


by 2017zc @ 2018-07-31 20:12:39

女的?再见


by Arcturus1350 @ 2018-07-31 20:17:20

@2017zc 再见


| 下一页