#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#define maxn 10005
using namespace std;
int n,m,w[maxn],dfn[maxn],low[maxn],tim,c[maxn],scc,W[maxn];
bool insta[maxn];
vector<int>g[maxn],e[maxn];
stack<int>sta;
void dfs(int now,int fa){
dfn[now]=low[now]=++tim;
sta.push(now);insta[now]=1;
for(int i=0,siz=g[now].size(),v;i<siz;i++)
if(!dfn[v=g[now][i]])
dfs(v,now),low[now]=min(low[v],low[now]);
else if(insta[g[now][i]])
low[now]=min(low[now],dfn[v]);
if(dfn[now]==low[now]){
int tmp=-1;scc++;
while(tmp!=now){
tmp=sta.top();
sta.pop();
W[scc]+=w[tmp];
c[tmp]=scc;
insta[tmp]=0;
}
}
}
void tarjan(){
memset(dfn,0,sizeof dfn);
memset(low,0,sizeof low);
tim=0,scc=0;
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i,0);
}
void thinen(){
for(int i=1;i<=n;i++)
for(int j=0,siz=g[i].size();j<siz;j++)
if(c[i]!=c[g[i][j]])
e[c[i]].push_back(c[g[i][j]]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
}
tarjan();
thinen();
bool inq[maxn]={};
int dis[maxn]={};
queue<int>q;
for(int i=1;i<=scc;i++)q.push(i),inq[i]=1,dis[i]=W[i];
while(!q.empty()){
int now=q.front();q.pop(),inq[now]=0;
for(int i=0,siz=e[now].size();i<siz;i++)
if(dis[e[now][i]]<dis[now]+W[e[now][i]]){
dis[e[now][i]]=dis[now]+W[e[now][i]];
if(!inq[e[now][i]]){
inq[e[now][i]]=1;
q.push(e[now][i]);
}
}
}
int ans=0;
for(int i=1;i<=scc;i++)
ans=max(dis[i],ans);
printf("%d",ans);
}
Tarjan缩点
最新推荐文章于 2024-07-15 21:36:37 发布