萌新刚学tarjan求调
查看原帖
萌新刚学tarjan求调
274935
_Z_Y_X_楼主2022/7/13 09:15

rt,又WA又T

离谱的是直接输出dfn都不是0

强行改成0后好像会RE

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,u[10005],v[10005],e_cnt,e_head[10005],suo_cnt,suo_head[10005],in[10005];
int a[10005],dis[10005];
int dfn[10005],low[10005],zhan[10005],tp,dfncnt,is_in[10005];
int scc[10005],siz[10005],sum;
struct node{
	int to,nxt;
}e[100005],suo[100005];
void e_add(int u,int v){
	e[++e_cnt].to=v;
	e[e_cnt].nxt=e_head[u];
	e_head[u]=e_cnt;
}
void suo_add(int u,int v){
	suo[++suo_cnt].to=v;
	suo[suo_cnt].nxt=suo_head[u];
	suo_head[u]=suo_cnt;
}
void tarjan(int x){
	dfn[x]=low[x]=++dfncnt;
	is_in[x]=1,zhan[++tp]=x;
	for(int i=e_head[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(dfn[y]==0){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(is_in[y]==1){
			low[x]=min(low[x],dfn[y]);
			//low[x]=min(low[x],low[y]);
		}
	}
	if(low[x]==dfn[x]){
		int y;
		while(y=zhan[tp--]){
			scc[y]=x;
			is_in[y]=0;
			if(x==y) break;
			a[x]=a[x]+a[y];
		}
	}
}
int topo(){
	queue<int> Q;
	for(int i=1;i<=n;i++){
		//cout <<a[i]<<endl;
		if(scc[i]==i&&in[i]==0){
			Q.push(i);
			dis[i]=a[i];
		}
	}
	
	while(!Q.empty()){
		int qwq=Q.front();
		Q.pop();
		for(int i=suo_head[qwq];i;i=suo[i].nxt){
			int to=suo[i].to;
			dis[to]=max(dis[to],dis[qwq]+a[to]);
			in[to]--;
			if(in[to]==0){
				Q.push(to);
			}
		}
	}
	
	int answer=-1;
	for(int i=1;i<=n;i++){
		answer=max(answer,dis[i]);
	}
	return answer;
}
int main(){
	//freopen("P3387_2.in","r",stdin);
	//memset(dfn,0,sizeof(dfn));
	cin >>n>>m;
	for(int i=1;i<=n;i++){
		cin >>a[i];
	}
	for(int i=1;i<=m;i++){
		cin >>u[i]>>v[i];
		e_add(u[i],v[i]);
	}
	
	for(int i=1;i<=n;i++){
		//dfn[i]=0;
		cout <<dfn[i]<<" ";
	}
	
	for(int i=1;i<=n;i++){
		if(dfn[i]==0){
			tarjan(i);
			//cout <<i<<"tarjan";
		}
	}
	for(int i=1;i<=m;i++){
		int x=scc[u[i]],y=scc[v[i]];
		//cout <<i<<" "<<x<<" "<<y<<endl;
		if(x!=y){
			suo_add(x,y);
			in[y]++;
		}
	}
	cout <<topo();
	return 0;
}
2022/7/13 09:15
加载中...