萌新求助缩点tarjan
查看原帖
萌新求助缩点tarjan
302394
dingshengyang楼主2022/6/18 17:47

RT

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int h[N],e[N],ne[N],idx;
int h1[N],e1[N],ne1[N],idx1;
int n,m,is_stk[N],f[N];
int stk[N],top,timestamp;
int id[N],scc_cnt,low[N];
int dfn[N],maxid[N];
void add(int a,int b){
	e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
void add1(int a,int b){
	e1[idx1] = b,ne1[idx1] = h1[a],h1[a] = idx1++;
}
void tarjan(int u){
	dfn[u] = low[u] = ++timestamp;
	is_stk[u] = 1,stk[++top] = u;
	for(int i = h[u];i != -1;i = ne[i]){
		int j = e[i];
		if(!dfn[j]){
			tarjan(j);
			low[u] = min(low[u],low[j]);
		}else if(is_stk[j]) low[u] = min(low[u],low[j]);
	}
	if(dfn[u] == low[u]){
		int y;
		scc_cnt ++;
		do{
			y = stk[top--];
			is_stk[y] = 0;
			id[y] = scc_cnt;
			maxid[scc_cnt] = max(maxid[scc_cnt],y); 
		}while(u!=y);
	} 
}
int main() {
	memset(h,-1,sizeof(h));
	memset(h1,-1,sizeof(h1));
	cin >> n >> m;
	for(int i = 1;i <= m;i ++){
		int x,y;
		cin >> x >> y;
		add(x,y);
	}
	for(int i = 1;i <= n;i ++)
		if(!dfn[i]) tarjan(i);
//	for(int i = 1;i <= scc_cnt;i ++)
//		cout << maxid[i] << " ";
//	cout << endl;
	for(int i = 1;i <= n;i ++){
		for(int j = h[i];j != -1;j = ne[j]){
			if(id[i] != id[e[j]]){
				add1(id[i],id[e[j]]);
			}
		}
	}
	for(int i = 1;i <= scc_cnt;i ++)f[i] = maxid[i];
	for(int i = 1;i <= scc_cnt;i ++) 
		for(int j = h1[i];j != -1;j = ne1[j])
			f[i] = max(f[i],maxid[e1[j]]);
	for(int i = 1;i <= n;i ++)
		cout << f[id[i]] << " ";
	return 0;
}
2022/6/18 17:47
加载中...