萌新第二次求助
查看原帖
萌新第二次求助
200044
JS_TZ_ZHR楼主2020/4/29 19:35

RT

50分WA了,求差错

#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<=total; 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++) {
			int x=color[i],y=color[ve[i][j]];
			if(x!=y) {
				from[y].push_back(x);
				to[x].push_back(y);
				in[y]++;
			}
		}
	}
	bfs();
	for(int i=1; i<=total; i++) {
		int y=tp[i];
		f[y]=dis[y];
		ans=max(ans,f[y]);
		for(int j=0; j<from[y].size(); j++) {
			f[y]=max(f[y],dis[y]+f[from[y][j]]);
			ans=max(ans,f[y]);
		}
	}
	printf("%d\n",ans);
}
2020/4/29 19:35
加载中...