求助
查看原帖
求助
200044
JS_TZ_ZHR楼主2020/4/29 12:41

RT

#include<bits/stdc++.h>
using namespace std;
int n,m,sum[10005],u,v,dfn[10005],cnt,low[10005],total,color[10005],dis[10005];
int in[10005],tp[10005],ans,f[10005],_cnt;
bool vis[10005];
vector<int>ve[10005],from[10005],to[10005];
stack<int>s;
void tarjan(int now) {
	dfn[now]=low[now]=++cnt;
	s.push(now);
	vis[now]=true;
	for(int i=0; i<ve[now].size(); i++) {
		if(!dfn[ve[now][i]]) {
			tarjan(ve[now][i]);
			low[now]=min(low[now],low[ve[now][i]]);
		} else if(vis[ve[now][i]])
			low[now]=min(low[now],dfn[ve[now][i]]);
	}
	if(low[now]==dfn[now]) {
		total++;
		while(1) {
			int temp=s.top();
			color[s.top()]=total;
			dis[total]+=sum[s.top()];
			vis[s.top()]=false;
			s.pop();
			if(now==temp)break;
		}
	}
	return;
}
void bfs() {
	queue<int>q;
	for(int i=1; i<=n; i++)if(!in[i])q.push(i);
	while(!q.empty()) {
		int y=q.front();
		tp[++_cnt]=y;
		q.pop();
		for(int i=0; i<to[y].size(); i++) {
			in[to[y][i]]--;
			if(!in[to[y][i]])q.push(to[y][i]);
		}
	}
	return;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)scanf("%d",sum+i);
	for(int i=1; i<=m; i++) {
		scanf("%d%d",&u,&v);
		ve[u].push_back(v);
	}
	for(int i=1; i<=n; i++)if(!dfn[i])tarjan(i);
	for(int i=1; i<=n; i++) {
		for(int j=0; j<ve[i].size(); i++) {
			if(color[i]!=color[ve[i][j]]) {
				from[color[ve[i][j]]].push_back(color[i]);
				to[color[i]].push_back(color[ve[i][j]]);
				in[color[ve[i][j]]]++;
			}
		}
	}
	bfs();
	for(int i=1; i<=total; i++) {
		f[i]=dis[i];
		for(int j=0; j<from[i].size(); j++) {
			f[i]=max(f[i],dis[i]+f[from[i][j]]);
			ans=max(ans,f[i]);
		}
	}
	printf("%d\n",ans);
}
2020/4/29 12:41
加载中...