1 条题解
-
1
不想打题解了,记得别写 dfs,会超时。
#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],vec; 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); } } 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++){ f[i]=siz[i]; g[i]=1; } for(int x=cnt;x>=1;x--){ for(int y:G[x]){ if(f[y]<f[x]+siz[y]){ f[y]=f[x]+siz[y]; g[y]=g[x]; } else if(f[y]==f[x]+siz[y]){ g[y]=(g[y]+g[x])%mod; } } } 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; }
- 1
信息
- ID
- 1093
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 40
- 已通过
- 17
- 上传者