如果你是 Tarjan + SPFA 做法,且 _87pts_如下
只需将 SPFA 中的 vis 数组删除即可
具体如下:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,st,pt,ans;
struct edge1{
int to,nex;
}e1[N];
int head1[N],cnt1;
struct edge2{
int to,nex;
}e2[N];
int head2[N],cnt2;
int point[N];
int low[N],dfn[N],vis[N],num;
int p[N],tot,dis[N],bar[N],w[N];
stack<int>s;
void add1(int u,int v){
e1[++cnt1].to=v;
e1[cnt1].nex=head1[u];
head1[u]=cnt1;
}
void add2(int u,int v){
e2[++cnt2].to=v;
e2[cnt2].nex=head2[u];
head2[u]=cnt2;
}
void Tarjan(int u){
low[u]=dfn[u]=++num;
vis[u]=1;
s.push(u);
for(int i=head1[u];i!=0;i=e1[i].nex){
int v=e1[i].to;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
++tot;
int k=0;
while(k!=u){
k=s.top();
s.pop();
p[k]=tot;
vis[k]=0;
}
}
}
void scc(){
for(int u=1;u<=n;u++){
for(int j=head1[u];j!=0;j=e1[j].nex){
int v=e1[j].to;
if(p[u]!=p[v])add2(p[u],p[v]);
}
}
}
void Spfa(){
//memset(vis,0,sizeof vis);
dis[p[st]]=w[p[st]];
queue<int>q;
q.push(p[st]);
//vis[st]=true;
while(!q.empty()){
int u=q.front();
q.pop();
// if(vis[u])continue;
// vis[u]=true;
for(int j=head2[u];j!=0;j=e2[j].nex){
int v=e2[j].to;
if(dis[u]+w[v]>dis[v]){
dis[v]=dis[u]+w[v];
//if(!vis[v])
q.push(v);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add1(u,v);
}
for(int i=1;i<=n;i++)cin>>point[i];
cin>>st>>pt;
for(int i=1;i<=pt;i++){
int x;
cin>>x;
bar[x]=1;
}
for(int i=1;i<=n;i++)
if(!dfn[i])Tarjan(i);
scc();
for(int i=1;i<=n;i++){
w[p[i]]+=point[i];
if(bar[i])bar[p[i]]=1;
}
Spfa();
for(int i=1;i<=tot;i++)
if(bar[i])ans=max(ans,dis[i]);//cout<<dis[i]<<' ';
cout<<ans;
return 0;
}
(调了 2.5 小时的码 (bushi )