RT
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
stack<int> se;
vector<int> son[10001];
vector<int> s[1001];
int n,m,va[10001];
int dfn[10001]={0},low[10001]={0},index=1,num=1;
bool flag[10001];
int ggg[10001];
int dp[1001];
int guanxi[1001][1001];
void tarjan(int x)
{
dfn[x]=low[x]=index++;
se.push(x);
flag[x]=1;
for(int i=0;i<son[x].size();i++)
{
if(!dfn[son[x][i]])
{
tarjan(son[x][i]);
low[x]=min(low[x],low[son[x][i]]);
}
else if(flag[son[x][i]]==1)
low[x]=min(low[x],dfn[son[x][i]]);
}
int g,nnn=0;
if(dfn[x]==low[x])
{
do
{
g=se.top();
se.pop();
nnn+=va[g];
flag[x]=0;
ggg[g]=num;
}while(x!=g);
dp[num]=nnn;
num++;
}
}
int dfs(int x)
{
for(int i=0;i<s[x].size();i++)
dp[x]+=dp[s[x][i]];
return dp[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>va[i];
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
son[x].push_back(y);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<son[i].size();j++)
{
if (guanxi[ggg[i]][ggg[son[i][j]]]==0&&ggg[i]!=ggg[son[i][j]])
{
guanxi[ggg[i]][ggg[son[i][j]]]=1;
s[ggg[i]].push_back(ggg[son[i][j]]);
}
}
}
for(int i=1;i<num;i++)
ans=max(ans,dfs(i));
cout<<ans;
return 0;
}
|*´Å`)ノ