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!!!