40分 WA1,3,4,5,7,9
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=1e5+5;
int fir[N],from[M],nxt[M],to[M],tot;
void add(int u,int v)
{
nxt[++tot]=fir[u];
fir[u]=tot;
from[tot]=u;
to[tot]=v;
}
int w[N],val[N],dfn[N],low[N],s[N],co[N],col,num,top;
bool book[N];
void tarjan(int u)
{
dfn[u]=low[u]=++num,s[++top]=u,book[u]=1;
for (int e=fir[u];e;e=nxt[e])
{
int v=to[e];
if (!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (book[v]) low[u]=min(low[u],dfn[v]);
}
if (dfn[u]==low[u])
{
col++;
do
{
co[s[top]]=col;
val[col]+=w[s[top]];
book[s[top--]]=0;
}while (u!=s[top+1]);
}
}
vector<int> e1[N];
vector<int> e2[N];
int in[N],ans[N];
void topo_sort()
{
queue<int> q;
for (int i=1;i<=col;i++)
if (!in[i]) q.push(i);
while (!q.empty())
{
int u=q.front();
q.pop();
ans[++ans[0]]=u;
for (auto v:e1[u])
{
in[v]--;
if (!in[v]) q.push(v);
}
}
}
int dp[N];
int DP()
{
for (int i=1;i<=col;i++)
{
int k=ans[i];
dp[k]=val[k];
for (auto j:e2[k])
dp[k]=max(dp[k],dp[j]+val[k]);
}
int res=0;
for (int i=1;i<=col;i++)
res=max(res,dp[i]);
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,m,u,v;
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>w[i];
while (m--)
{
cin>>u>>v;
add(u,v);
}
for (int i=1;i<=n;i++)
if (!dfn[i]) tarjan(i);
for (int i=1;i<=tot;i++)
{
u=from[i],v=to[i];
if (co[u]!=co[v])
{
in[v]++;
e1[u].push_back(v);
e2[v].push_back(u);
}
}
topo_sort();
cout<<DP()<<'\n';
return 0;
}
自己写的查不出问题来,题解改了变量名、改了邻接表也寄了,这什么玄学情况。