40分求助!!
查看原帖
40分求助!!
505081
dzn123456楼主2022/5/8 16:33
#include<bits/stdc++.h>
using namespace std;
int n,m;
queue <int> q;
vector <int> ss[600086];
vector <int> r2[600086];
int f[1000005],ne[1000005],v[1000005];
int top,cnt,cntt;
int h[1000086],r[1000005],ans[1000005];
void add(int x,int y){
	ne[++top]=h[x];
	f[top]=x;
	v[top]=y;
	h[x]=top;
} 
void toto(){
	for(int i=1;i<=cnt;i++){
		if(r[i]==0)
		q.push(i);
	}
	while(!q.empty()){
		int k=q.front();
		q.pop();
		ans[++cntt]=k;
		for(int i=1;i<=ss[k].size();i++){
			int v=ss[k][i-1];
			r[v]--;
			if(r[v]==0)
			q.push(v);
		}
	}
}
int dfn[1000086],dia[1000086],low[1000086];
int stc[1000086],cnm,vis[1000086],iop;
int dis[1000086];
void dfs(int x){
	dfn[x]=low[x]=++cnm;
	stc[++iop]=x;
	vis[x]=1;
	for(int i=h[x];i!=-1;i=ne[i]){
		int j=v[i];
		if(!dfn[j]){
			dfs(j);
			low[x]=min(low[x],low[j]);
		}
		else
		if(v[j]){
			low[x]=min(low[x],dfn[j]);
		}
	} 
	if(dfn[x]==low[x]){
		cnt++;
		while(1){
			vis[stc[iop]]=cnt;
			dia[cnt]+=dis[stc[iop]];
			vis[stc[iop]]=0;
			iop--;
			if(x==stc[iop+1])
			break;
		}
	} 
}
int f1[1000085];
int main(){
	memset(h,-1,sizeof(h));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>dis[i];
	}
	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])
		dfs(i);
	}
	for(int i=1;i<=top;i++){
		int x,y;
		if(vis[f[i]]!=vis[v[i]])
		{
			x=vis[f[i]],y=vis[v[i]];
			r[y]++;
			ss[x].push_back(y),r2[y].push_back(x);
		}
	}
	toto();
	for(int i=1;i<=cnt;i++){
		int g=ans[i];
		f1[g]=dia[g];
		for(int j=1;j<=r2[g].size();j++){
		f1[g]=max(f1[g],f1[r2[g][j-1]]+dia[g]);
	}
}
	int anss=-1;
	for(int i=1;i<=cnt;i++){
		anss=max(anss,f1[i]);
	}
	cout<<anss;
	return 0;
}
2022/5/8 16:33
加载中...