topo 42pts求调玄关
查看原帖
topo 42pts求调玄关
798043
Ehuo_ovo楼主2023/9/26 18:22
#include<bits/stdc++.h>
using namespace std;

int n,m;
struct edge{
	int to,ne;
}e[100005];int h[100005],ecnt;
void ade(int u,int v){
	e[++ecnt]={v,h[u]},h[u]=ecnt;
}
int dfn[100005],low[100005],t;
int ins[100005],pos[100005],cnt;
stack<int>s;
struct node{
	vector<int>to;
	vector<int>pt;
	int num;
}scc[200005];
void tarjan(int u){
	low[u]=dfn[u]=++t;
	s.push(u);ins[u]=1;
	for(int i=h[u];i;i=e[i].ne){
		int to=e[i].to;
		if(!dfn[to]){
			tarjan(to);
			low[u]=min(low[u],low[to]);
		}
		else if(ins[to]){
			low[u]=min(low[u],dfn[to]);
		}
	}
	if(low[u]==dfn[u]){
		cnt++;
		while(1){
			int top=s.top();s.pop();
			scc[cnt].pt.push_back(top);
			ins[top]=0;pos[top]=cnt;
			if(top==u) break;
		}
	}
}

int ans;
int flag[100005];
int f[200005];
int in[200005];
queue<int>q;
void topo(){
	for(int i=1;i<=cnt;i++){
		if(!in[i]) q.push(i);
	}
	while(!q.empty()){
		int u=q.front();
		if(u<=cnt) flag[u]=1;
//		cout<<"U:"<<u<<endl;
		q.pop();
		for(int i=0;i<scc[u].to.size();i++){
			int to=scc[u].to[i];
			in[to]--;
			if(in[to]==0) q.push(to);
			if(to>cnt){
				if(flag[to-cnt]==0){
					f[to]=max(f[to],f[u]+scc[to].num);
//					cout<<">>TO["<<to<<"]:";
//					cout<<f[to]<<endl;
				}
				else{
					f[to]=f[u];
				}
			}
			else{
				f[to]=max(f[to],f[u]+scc[to].num);
//				cout<<">>TO["<<to<<"]:";
//				cout<<f[to]<<endl;
			}
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;
		ade(u,v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=cnt;i++){
		int num=scc[i].pt.size();
		scc[i].num=scc[i+cnt].num=num;
		f[i]=f[i+cnt]=scc[i].num;
	}
	for(int i=1;i<=n;i++){
		for(int j=h[i];j;j=e[j].ne){
			int to=e[j].to;
			if(pos[i]==pos[to]) continue;
			scc[pos[i]].to.push_back(pos[to]);
			scc[pos[i]+cnt].to.push_back(pos[to]+cnt);
			in[pos[to]]++;in[pos[to]+cnt]++;
		}
	}
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<scc[i].to.size();j++){
			int to=scc[i].to[j];
			scc[to].to.push_back(i+cnt);
			in[i+cnt]++;
		}
	}
//	for(int i=1;i<=cnt*2;i++){
//		cout<<"scc"<<i<<":";
//		for(int j=0;j<scc[i].to.size();j++){
//			cout<<scc[i].to[j]<<" ";
//		}cout<<endl;
//		cout<<"in:"<<in[i]<<endl;
//	}
	topo();
	int ans=max(f[pos[1]],f[pos[1]+cnt]);
	cout<<ans<<endl;
}
2023/9/26 18:22
加载中...