Arcturus1350 @ 2018-07-31 19:48:20
一脸懵逼
要是帮忙解决的话,就把小可爱抱走吧
// 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 再见