10分求助tarjin
  • 板块P3916 图的遍历
  • 楼主I_m_FW
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/11/15 14:41
  • 上次更新2023/11/4 00:29:51
查看原帖
10分求助tarjin
445896
I_m_FW楼主2021/11/15 14:41
#include <bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int h[N],to[N],ne[N],tot,t;
int h2[N],to2[N],ne2[N],num,d[N];
int n,mmm,id[N],low[N],dfn[N],st[N],top,cnt,maxx[N],ans[N];
bool inst[N],vis[N];
vector<int> v[N];
void add(int x,int y){
	++tot;to[tot]=y;ne[tot]=h[x];h[x]=tot;
}
void add2(int x,int y){
	++num;to2[num]=y;ne2[num]=h2[x];h2[x]=num;
}
void ta(int x){
	low[x]=++t;dfn[x]=t;
	st[++top]=x;inst[x]=true;
	for(int i=h[x];i;i=ne[i]){
		int y=to[i];
		if(!dfn[y]){
			ta(y);
			low[x]=min(low[x],low[y]);
		}else if(inst[y]){
			low[x]=min(low[x],dfn[y]);
		}
	}
	if(low[x]==dfn[x]){
		cnt++;int y;
		do{
			y=st[top--];inst[y]=false;
			id[y]=cnt;
			v[cnt].push_back(y);
		}while(y!=x);
	}
}
void topo(){
	queue<int> q;
	for(int i=1;i<=cnt;i++){
		if(d[i]==0){
			q.push(i);
		}
	}
	while(q.size()){
		int u=q.front();q.pop();
		for(int i=h2[u];i;i=ne2[i]){
			int y=to2[i];
			d[y]--;maxx[y]=max(maxx[y],maxx[u]);
			if(d[y]==0){
				q.push(y);
			}
		}
	}
}
int main(){
	cin>>n>>mmm;
	while(mmm--){
		int xx,xy;scanf("%d%d",&xx,&xy);
		add(xx,xy);
	}
	ta(1);
	for(int i=1;i<=n;i++)
		for(int j=h[i];j;j=ne[j]){
			int y=to[j];
			if(id[y]==id[i]){
				maxx[id[i]]=max(maxx[id[i]],i);
				maxx[id[y]]=max(maxx[id[y]],y);
			}else {
				add2(id[y],id[i]);
				d[id[i]]++;
				maxx[id[i]]=max(maxx[id[i]],i);
				maxx[id[y]]=max(maxx[id[y]],y);
			}
		}
	topo();
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<v[i].size();j++){
			int y=v[i][j];
			ans[y]=max(ans[y],maxx[i]);
		}
	}
	for(int i=1;i<=n;i++)cout<<ans[i]<<' ';
}```
2021/11/15 14:41
加载中...