tarjan + topo 40pts WA + RE求调
调吐了。。。
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int n,m;
int a[10005];
vector<int> adj[10005];
vector<int> adj2[10005];
stack<int> st;
int pre[10005];
int low[10005];
int sccNo[10005];
int dscc[10005];
int dis[10005];
int ind[10005];
int scccount = 0;
int dfsTime = 0;
// 缩点
void tarjan(int u)
{
pre[u] = low[u] = ++ dfsTime;
st.push(u);
for(int i = 0;i < adj[u].size();i ++)
{
int v = adj[u][i];
if(!pre[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(!sccNo[v])
{
low[u] = min(low[u],pre[v]);
}
}
if(low[u] == pre[u])
{
sccNo[u] = ++ scccount;
dscc[scccount] = a[u];
while(true)
{
if(st.empty()) break;
if(st.top() == u) break;
int f = st.top();
sccNo[f] = scccount;
dscc[scccount] += a[f];
st.pop();
}
st.pop();
}
}
void toposort()
{
queue<int> q;
for(int i = 1;i <= n;i ++)
{
if(ind[i] == 0)
{
dis[i] = dscc[i];
q.push(i);
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = 0;i < adj2[u].size();i ++)
{
int v = adj[u][i];
dis[v] = max(dis[v],dis[u] + dscc[v]);
ind[v] --;
if(!ind[v]) q.push(v);
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i ++) cin >> a[i];
while(m --)
{
int u,v;
cin >> u >> v;
adj[u].push_back(v);
}
for(int i = 1;i <= n;i ++)
{
if(!pre[i])
{
dfsTime = 0;
tarjan(i);
}
}
for(int i = 1;i <= n;i ++)
{
for(int j = 0;j < adj[i].size();j ++)
{
int g = adj[i][j];
if(sccNo[i] != sccNo[g])
{
adj2[sccNo[i]].push_back(sccNo[g]);
ind[sccNo[g]] ++;
}
}
}
// 变为有向无环图
toposort();
int ans = -10000000;
for(int i = 1;i <= n;i ++)
{
ans = max(ans,dis[i]);
}
cout << ans << endl;
return 0;
}