0pts求助,样例不过
查看原帖
0pts求助,样例不过
561949
syr1125楼主2024/4/25 20:01
#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, m, t = 0, cnt = 0;
int point[10005];
vector<int> e[10005], a[10005];
int dfn[10005], low[10005], id[10005], deg[10005], dist[10005];
stack<int> st;
int vis[10005];

void tarjan(int now)
{
	if (dfn[now]) return;
	st.push(now), vis[now] = 1;
	dfn[now] = low[now] = ++ t;
	for (int i = 0; i < e[now].size(); i ++)
	{
		if (dfn[e[now][i]] == 0)
		{
			tarjan(e[now][i]);
			low[now] = min(low[now], low[e[now][i]]);
		}
		else if (vis[e[now][i]])
		{
			low[now] = min(low[now], dfn[e[now][i]]);
		}
	}
	if (dfn[now] == low[now])
	{
		cnt ++;
		while (!st.empty())
		{
			int cur = st.top();
			st.pop(); 
			vis[cur] = 0, id[cur] = cnt;
			point[now] += point[cur];
			if (cur == now) break;
		}
	}
}

void init()
{
	for (int i = 1; i <= n; i ++)
	{
		for (int j = 0; j < e[i].size(); j ++)
		{
			if (id[e[i][j]] != id[i])
			{
				a[id[i]].push_back(id[e[i][j]]);
				deg[id[e[i][j]]] ++;
			}
		}
	}
} 

int topo()
{
	queue <int> q;
	int tot = 0;
	for (int i = 1; i <= cnt; i ++)
	{
		if (!deg[i])
		{
			q.push(i);
	        dist[i] = point[i];
		} 
	}
	while (!q.empty())
	{
		int k = q.front();
		q.pop();
		for (int i = 0; i < a[k].size(); i ++)
		{
			int v = a[k][i];
			dist[v] = max(dist[v], dist[k] + point[v]);
			deg[v] --;
			if (deg[v] == 0) q.push(v);
		}
	}
    int ans = 0;
    for (int i = 1; i <= n; i ++)
    	ans = max(ans, dist[i]);
    return ans;
}


signed main()
{
	scanf("%lld %lld", &n, &m);
	for (int i = 1; i <= n; i ++)
	{
		scanf("%lld", &point[i]);
	}
	for (int i = 1; i <= m; i ++)
	{
		int x, y;
		scanf("%lld %lld", &x, &y);
		e[x].push_back(y);
	}
	for (int i = 1; i <= n; i ++)
	{
		if (!dfn[i]) tarjan(i);
	}
	init();
	cout << topo() << endl;
	return 0;
}

查了n遍了,跪求改错

2024/4/25 20:01
加载中...