TLE 76分求助
查看原帖
TLE 76分求助
654281
reclusive楼主2023/12/19 13:11

不知道为什么 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;
}
2023/12/19 13:11
加载中...