#include <bits/stdc++.h>
using namespace std ;
long long dq[10010] , n , m ;
bool bj[10010][10010] ;
long long jh[10010] , js = 1 ;
bool vis[10010] ;
long long in[10010] , lo[10010] ;
long long sta[10010] , top ;
long long jq[10010] ;
bool bj2[10010][10010] ;
long long kq[10010] ;
long long dp[10010] ;
void dfs( long long wz )
{
sta[top] = wz ;
top ++ ;
vis[wz] = 1 ;
lo[wz] = in[wz] ;
// cout<< wz << ' ' << in[wz] << ' ' << lo[wz] << endl ;
// for( long long i = 0 ; i < top ; i ++ )
// {
// cout<< sta[i] << ' ' ;
// }
// cout<< endl << "_____" << endl ;
for( long long i = 0 ; i < n ; i ++ )
{
if( bj[wz][i] )
{
if( in[i] == 0 )
{
in[i] = in[wz] + 1 ;
dfs( i ) ;
lo[wz] = min( lo[wz] , lo[i] ) ;
}
else
{
if( vis[i] )
{
lo[wz] = min( lo[wz] , lo[i] ) ;
}
}
}
}
if( lo[wz] == in[wz] )
{
// cout<< wz << ' ' << in[wz] << ' ' << lo[wz] << endl ;
do
{
jq[js] += dq[sta[top - 1]] ;
jh[sta[top - 1]] = js ;
vis[sta[top - 1]] = 0 ;
// cout<< sta[top - 1] << ' ' ;
top -- ;
}
while( wz != sta[top] ) ;
js ++ ;
// cout<< endl ;
}
}
void topo()
{
queue<long long> q ;
for( long long i = 0 ; i < js ; i ++ )
{
if( kq[i] == 0 )
{
q.push( i ) ;
}
}
long long v ;
while( q.size() != 0 )
{
v = q.front() ;
q.pop() ;
dp[v] += jq[v] ;
for( long long i = 0 ; i < js ; i ++ )
{
if( bj2[v][i] )
{
kq[i] -- ;
dp[i] = max( dp[i] , dp[v] ) ;
if( kq[i] == 0 )
{
q.push( i ) ;
}
}
}
}
}
int main ()
{
freopen( "p3387_7.in" , "r" , stdin ) ;
cin >> n >> m ;
for( long long i = 0 ; i < n ; i ++ )
{
cin>> dq[i] ;
}
long long t1 , t2 ;
for( long long i = 0 ; i < m ; i ++ )
{
cin >> t1 >> t2 ;
t1 -- ;
t2 -- ;
bj[t1][t2] = 1 ;
}
for( long long i = 0 ; i < n ; i ++ )
{
if( in[i] == 0 )
{
in[i] = 1 ;
dfs( i ) ;
}
}
for( long long i = 0 ; i < n ; i ++ )
{
for( long long j = 0 ; j < n ; j ++ )
{
if( bj[i][j] && jh[i] != jh[j] && bj2[jh[i]][jh[j]] == 0 )
{
bj2[jh[i]][jh[j]] = 1 ;
kq[jh[j]] ++ ;
}
}
}
topo() ;
long long maxn = 0 ;
for( long long i = 0 ; i < js ; i ++ )
{
if( dp[i] > maxn )
{
maxn = dp[i] ;
}
}
cout<< maxn ;
return 0 ;
}
RT
7号点WA
dq、bj为缩点前点权、边(邻接矩阵)
jh为缩点时各点所属强连通分量,js为强连通分量个数
sta为栈,in为时间戳,lo为最小时间戳
jq、bj2为缩点后点、边
kq为入边数量,dp就是dp
思路是先缩点,之后用DAG上的dp求最长路