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;
}
posted @ 2023-11-12 19:44  HS_xh  阅读(34)  评论(2)    收藏  举报
init();