求调88tps,悬棺
查看原帖
求调88tps,悬棺
1037997
_TGWQ12_楼主2025/7/24 10:37
#include"bits/stdc++.h"
using namespace std;
const int N=1e6+5,inf=36501;
int dfn[N],low[N],Time,stk[N];
int tp=0,inscc[N],cnt,que[N],dp[N];
bool instk[N],vis[N];
int n,m,x,y,a,b,r,l,in[N];
vector<int>c[N],g[N];
void tarjan(int cur){
	dfn[cur]=low[cur]=++Time;	
	stk[tp++]=cur;instk[cur]=1;
	for(int i=0;i<c[cur].size();i++){
		int nxt=c[cur][i];
		if(!dfn[nxt]){
			tarjan(nxt);
			low[cur]=min(low[cur],low[nxt]);
		}
		else if(instk[nxt])
			low[cur]=min(low[cur],dfn[nxt]);
	}
	if(dfn[cur]==low[cur]){
		++cnt;
		do{
			inscc[stk[--tp]]=cnt;
			instk[stk[tp]]=0;
		}
		while(stk[tp]!=cur&&tp);
	}	
}
void topsort(){
	r=0,l=1;
	for(int i=1;i<=n;i++)
		if(in[i]==0)
			que[++r]=i; 
	dp[inscc[n]]=1;
	while(l<=r){
		int cur=que[l++];
		for(int i=0;i<g[cur].size();i++){
			int nxt=g[cur][i];
			if(dp[cur]) //可以到(可以到n的特殊点)的点是特殊点
				vis[nxt]|=vis[cur];
			dp[nxt]=min(inf,dp[nxt]+dp[cur]);
			in[nxt]--;
			if(in[nxt]==0)
				que[++r]=nxt;
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	n++;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		c[x].push_back(y);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i]) 
			tarjan(i);
	for(int i=1;i<=n;i++){
		for(int j=0;j<c[i].size();j++){
			int nxt=c[i][j];
			if(inscc[i]==inscc[nxt]){
				vis[inscc[i]]=1; //无论自环还是多个点的强连通都是特殊点
			}	
			else{
				in[inscc[i]]++;
				g[inscc[nxt]].push_back(inscc[i]);
			}
		}
	}
	topsort(); 
	int ans=0,num=0;
	for(int i=1;i<n;i++){
		if(dp[inscc[i]]!=0&&vis[inscc[i]]==1){ //是特殊点且可到n+1
			dp[inscc[i]]=inf;
		}
		ans=max(ans,dp[inscc[i]]); 
	}
	if(ans==inf)
		cout<<"zawsze\n";
	else
		cout<<ans<<'\n';
	for(int i=1;i<=n;i++)
		if(ans==dp[inscc[i]])
			num++;
	cout<<num<<'\n';
	for(int i=1;i<n;i++)
		if(ans==dp[inscc[i]])
			cout<<i<<' ';	
	return 0;
}

2025/7/24 10:37
加载中...