大概率可能是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;
}