tarjan太不友好惹555……
样例错误惹5555……
输出0呜呜呜……
大佬救命呜呜呜……
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e5+15;
int n,m,sum,tim,top,s;
int f[maxn],head[maxn],sd[maxn],dfn[maxn],low[maxn],stack[maxn],in_stack[maxn],u,v;
int h[maxn],ID[maxn],dp[maxn],t;
vector<int> e[maxn];
struct EDGE
{
int to;int next;int from;
}edge[100000];
void add(int x,int y)
{
edge[++sum].next=head[x];
edge[sum].from=x;
edge[sum].to=y;
head[x]=sum;
}
void tarjan(int now){
dfn[now]=low[now]=++tim;
in_stack[now]=1;
stack[++t]=now;
for (int i=head[now];i;i=edge[i].next)
if (dfn[edge[i].to]==0)
tarjan(edge[i].to),low[now]=min(low[now],low[edge[i].to]);
else if (in_stack[edge[i].to]==0)
low[now]=min(low[now],dfn[edge[i].to]);
if (dfn[now]==low[now]){
int cur;
do{
cur=stack[t];
t--;
sd[cur]=now;
in_stack[cur]=0;
if (now==cur) break;
f[now]+=f[cur];
}while (now!=cur);
}
}
int topo(){
queue<int> q;
int tot=0;
for (int i=1;i<=n;i++)
if (sd[i]&&!ID[i]) q.push(i),dp[i]=f[i];
while (!q.empty()){
int k=q.front();q.pop();
for (int i=0;i<e[k].size();i++){
int v=e[k][i];
dp[v]=max(dp[v],dp[k]+f[v]);
ID[v]--;
if (!ID[v]) q.push(v);
}
}
int ans=0;
for (int i=1;i<=n;i++) ans=max(ans,dp[i]);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&f[i]);
for (int i=1;i<=m;i++)
scanf("%d%d",&u,&v),add(u,v);
for (int i=1;i<=n;i++)
if (!dfn[i]) tarjan(i);
for (int i=1;i<=m;i++){
int x,y;x=sd[edge[i].from];y=sd[edge[i].to];
if (x!=y) e[x].push_back(y),ID[y]++;
}
printf("%d",topo());
return 0;
}
找出的人无条件关注(最好互关嘤嘤嘤) 小杨小小杨《——菜死了