SPFA 21分求助qwq
查看原帖
SPFA 21分求助qwq
502702
ABookCD楼主2023/8/5 16:57
#include<bits/stdc++.h>
using namespace std;
vector<int> g[200010];
int idx,top,scc;
int id[200010],sz[200010];
int dfn[200010],low[200010],st[200010],instk[200010];
int d[200010],dis[200010];
struct node{
	int v,w;
};
vector<node> e[200010],ep[200010];
void tarjan(int u){
	dfn[u]=low[u]=++idx;
	st[++top]=u,instk[u]=1;
	for(auto v:g[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else{
			if(instk[v]) low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		scc++;
		int v;
		do{
			v=st[top],top--;
			instk[v]=0;
			id[v]=scc;
		}while(v!=u);
	}
}
bool vis[200010];
void SPFA(int s){
	queue<int> q;
	q.push(s);
	vis[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(auto v:e[u]){
			if(d[v.v]<d[u]+v.w){
				d[v.v]=d[u]+v.w;
				if(!vis[v.v]) q.push(v.v);
			}
		}
	}
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
	//	g[v].push_back(u);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
	int s=id[1];
	for(int i=1;i<=n;i++){
		sz[id[i]]++;
	}
	for(int i=1;i<=n;i++){
		for(auto v:g[i]){
			
			if(id[v]!=id[i]){
		//	cout<<i<<" "<<v<<" "<<id[i]<<" "<<id[v]<<" "<<sz[id[v]]<<endl;
				e[id[i]].push_back(node{id[v],sz[id[v]]});
			}
		}
	}
	//cout<<scc<<endl;
//	cout<<s<<endl;
	SPFA(s);
	for(int i=1;i<=scc;i++) dis[i]=d[i];
	for(int i=1;i<=scc;i++){
		for(auto v:e[i]){
			ep[v.v].push_back(node{i,sz[id[i]]}); 
		}
	}
	for(int i=1;i<=scc;i++) e[i].clear();
	for(int i=1;i<=scc;i++){
		for(auto v:ep[i]){
			e[i].push_back(v);
		}
	}
	memset(d,0,sizeof d);
//	for(int i=1;i<=scc;i++){
//		for(auto v:e[i]){
//			cout<<i<<" "<<v.v<<" "<<v.w<<endl;
//		}
//	}
	//for(int i=1;i<=scc;i++) cout<<d[i]<<" ";
	SPFA(s);
	int ans=0;
	for(int i=1;i<=n;i++){
		for(auto v:g[i]){
			if(id[v]!=id[i]){
			//	cout<<i<<" "<<v<<" "<<id[i]<<" "<<id[v]<<" "<<dis[id[v]]<<" "<<d[id[i]]<<endl;
				if(dis[id[v]]>0&&d[id[i]]>0) ans=max(ans,dis[id[v]]+d[id[i]]);
			}
		}
	}
	cout<<ans+sz[id[1]]<<endl;
	return 0;
}
2023/8/5 16:57
加载中...