ATM
Tarjan 3题 ATM
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=500010;
struct node
{
int v,next;
}e[N],maps[N];
int n,m;
int st[N],head[N],cnt;
int atm[N],money[N];
int d[N],q[N];
void bulid(int a,int b)
{
e[++cnt].v=b;
e[++cnt].next=st[a];
st[a]=cnt;
}
int sta[N],top;
int dfn[N],low[N],dex;
bool vis[N];
int color[N],num;
void tarjan(int x)
{
dfn[x]=++dex;
low[x]=dex;
vis[x]=1;
sta[++top]=x;
for(int i=st[x];i!=0;i=e[i].next)
{
int temp=e[i].v;
if(!dfn[temp])
{
tarjan(temp);
low[x]=min(low[x],low[temp]);
}
else if(vis[temp]) low[x]=min(low[x],dfn[temp]);
}
if(dfn[x]==low[x])
{
vis[x]=0;
color[x]=++num;
while(sta[top]!=x)
{
color[sta[top]]=num;
vis[sta[top--]]=0;
}
top--;
}
}
void add()
{
cnt=0;
for(int i=1;i<=n;++i)
for(int j=st[i];j!=0;j=e[j].next)
{
int temp=e[j].v;
if(color[i]!=color[temp])
{
maps[++cnt].v=color[temp];
maps[cnt].next=head[color[i]];
head[color[i]]=cnt;
}
}
}
void spfa(int x)
{
memset(vis,0,sizeof(vis));
int l=1,r=1;
q[l]=x;
vis[x]=1;
d[x]=money[x];
while(l<=r)
{
int u=q[l++];
for(int i=head[u];i!=0;i=maps[i].next)
{
int v=maps[i].v;
if(d[v]<d[u]+money[v])
{
d[v]=d[u]+money[v];
if(vis[v]) continue;
q[++r]=v;
vis[v]=1;
}
}
vis[u]=0;
}
}
signed main()
{
int a,b,i,s,p,o,ans=0;
cin>>n>>m;
for(int i=1;i<=m;++i)
{
cin>>a>>b;
bulid(a,b);
}
for(int i=1;i<=n;++i)
if(!dfn[i]) tarjan(i);
add();
for(int i=1;i<=n;++i)
{
cin>>atm[i];
money[color[i]]+=atm[i];
}
cin>>s>>p;
spfa(color[s]);
for(int i=1;i<=p;++i)
{
cin>>o;
ans=max(ans,d[color[o]]);
}
cout<<ans;
}

浙公网安备 33010602011771号