50pts求助!!!
查看原帖
50pts求助!!!
81832
Starry___sky楼主2021/5/10 20:26

大概率可能是tarjan或者拓扑建边时错了,但是具体是哪里不清楚。

#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

vector<int>edge[N];
vector<int>EDGE[N];
stack<int>st;

int n, m;
int tim = 0;
int num = 0;

int dfn[N], low[N];
bool vis[N];

int val[N], in[N];
int fa[N];

int ans = 0;
int f[N];
int a[N];

void tarjan(int now)
{
	dfn[now] = low[now] = ++tim;
	st.push(now);
	vis[now] = 1;
	for(int i = 0; i < edge[now].size(); i++)
	{
		int v = edge[now][i];
		if(!dfn[v])
		{
			tarjan(v);
			low[now] = min(low[now], low[v]);
		}
		else if(vis[v])
			low[now] = min(low[now], low[v]);
	}
	if(dfn[now] == low[now])
	{
		a[++num] += val[now];
		fa[now] = num;
		while(!st.empty())
		{
			int y = st.top();
			fa[y] = num;
			vis[y] = 0;
			st.pop();
			if(y == now)
				continue;
			a[num] += val[y];
		}
	}
}

void find()
{
	queue<int>q;
	for(int i = 1; i <= num; i++)
	{
		if(!in[i])
		{
			q.push(i);
			f[i] = a[i];
		}
	}
	while(!q.empty())
	{
		int v = q.front();
		q.pop();
		for(int i = 0; i < EDGE[v].size(); i++)
		{
			int to = EDGE[v][i];
			f[to] = max(f[to], f[v] + a[to]);
			in[to]--;
			if(!in[to])
				q.push(to);
		}
	}
	for(int i = 1; i <= n; i++)
		ans = max(ans, f[i]);
}

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		cin >> val[i];
	for(int i = 1; i <= m; i++)
	{
		int x, y;
		cin >> x >> y;
		edge[x].push_back(y);
	}
	for(int i = 1; i <= n; i++)
		if(!dfn[i])
			tarjan(i);
	for(int i = 1; i <= n; i++)
		for(int j = 0; j < edge[i].size(); j++)
		{
			int v = edge[i][j];
			if(fa[v] == fa[i])
				continue;
			EDGE[fa[i]].push_back(fa[j]);
			in[fa[j]]++;
		}
	find();
	cout << ans << endl;
	system("pause");
	return 0;
}
2021/5/10 20:26
加载中...