萌新求助
查看原帖
萌新求助
441859
lmzOIer楼主2024/7/17 15:12
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
int n,m,a[maxn];

vector <int> edge[maxn],edge1[maxn];
stack <int> st;
int low[maxn],dfn[maxn],in_stack[maxn],fa[maxn],dfncnt,scccnt;
int num[maxn];

queue <int> q;
int in_dep[maxn];

int ans[maxn];
void tarjan(int u)
{
	dfn[u] = low[u] = ++dfncnt,in_stack[u] = 0;
	st.push(u);
	for (int i = 0;i < edge[u].size();i++)
	{
		int v = edge[u][i];
		if (!dfn[v])
			tarjan(v),low[u] = min(low[u],low[v]);
		else if (!in_stack[v])
			low[u] = min(low[u],dfn[v]);
	}
	if (dfn[u] == low[u])
	{
		in_stack[u] = 0;
		while (st.top() != u)
		{
			int v = st.top();
			fa[v] = u;
			in_stack[v] = 0,a[u] += a[v];
			st.pop();
		}
        st.pop(),fa[u] = u;
	}
}
int topo()
{
	for (int u = 1;u <= n;u++)
	{
		for (int i = 0;i < edge[u].size();i++)
		{
			int v = edge[u][i];
            //cout << u <<' '<< v << ' ' << fa[u] << ' ' << fa[v] << endl;
			if (fa[u] != fa[v])
				edge1[u].push_back(v),in_dep[v]++;//cout << u <<' '<< v << ' ' << fa[u] << ' ' << fa[v] << endl;
		}
	}
	int res = -1;
	for (int i = 1;i <= n;i++)
	{
		if (fa[i] == i and !in_dep[i])
			q.push(i),ans[i] = a[i],cout << ans[i] << '?' << endl;
	}
	while (!q.empty())
	{
		int k = q.front();
		q.pop();
		for (int i = 0;i < edge1[k].size();i++)
		{
			int v = edge1[k][i];
            //cout << ans[v] << ' ' << ans[k] + a[v] << endl;
 			ans[v] = max(ans[v],ans[k] + a[v]);
			in_dep[v]--;
			if (!in_dep[v])
				q.push(v);
		}
        //cout << ans[k] << "abcd" <<endl;
	}
	for (int i = 1;i <= n;i++)
		res = max(ans[i],res);
	return res;
}
int main()
{
	cin >> n >> m;	
	for (int i = 1;i <= n;i++)
		cin >> a[i];
	for (int i = 1;i <= m;i++)
	{
		int u,v;
		cin >> u >> v;
		edge[u].push_back(v);
	}
	for (int i = 1;i <= n;i++)
		if (!dfn[i])
			tarjan(i);
	cout << topo();
	return 0;
} 
2024/7/17 15:12
加载中...