求调
查看原帖
求调
757101
junee楼主2023/12/24 23:45
#include<iostream>
#include<cstring>
#include<algorithm> 
using namespace std;
const int N=2e5+10;
int h[N],e[N],ne[N],idx;
int h1[N],e1[N],ne1[N],idx1;
int timestamp,low[N],dfn[N];
int stk[N],top;
int instk[N];
int scc_cnt,id[N];
int din[N],dist[N],w[N];
int n,m;
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void ad(int a,int b){
	e1[idx]=b,ne1[idx]=h1[a],h1[a]=idx1++;
}
void tarjan(int u){
	dfn[u]=low[u]=++timestamp;
	stk[++top]=u,instk[u]=1;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(!dfn[j]){
			tarjan(j);
			low[u]=min(low[u],low[j]); 
		}
		else if(instk[j])low[u]=min(low[u],dfn[j]);
	}
	if(low[u]==dfn[u]){
		int y;
		scc_cnt++;
		do{
			y=stk[top--];
			w[u]+=w[y];
			id[y]=scc_cnt;
			instk[y]=0;
		}while(y!=u);
	}
}
int topo(){
	int hh=0,tt=0;
	int q[N];
	for(int i=1;i<=n;i++){
		if(id[i]==i&&!din[i])q[++tt]=i,dist[i]=w[i];
	}
	while(hh<=tt){
		int ver=q[hh++];
		for(int i=h1[ver];~i;i=ne1[i]){
			int j=e1[i];
			dist[j]=min(dist[j],dist[ver]+w[j]);
			--din[j];
			if(!din[j])q[++tt]=j;
		}
	}
	int maxn=0;
	for(int i=1;i<=n;i++)maxn=max(maxn,dist[i]);
	return maxn;
}
int main(){
	memset(h,-1,sizeof h);
	memset(h1,-1,sizeof h1);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>w[i];
	while(m--){
		int a,b;
		cin>>a>>b;
		add(a,b);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++){
		for(int j=h[i];~j;j=ne[j]){
			int k=e[j];
			int a=id[i],b=id[k];
			if(a!=b){
			    ad(a,b);
			    din[b]++;
			}
		}
	}
	cout<<topo();
    return 0;
}
2023/12/24 23:45
加载中...