1 条题解

  • 1
    @ 2023-12-19 13:29:23

    不想打题解了,记得别写 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
    上传者