###### 【强连通缩点+最长路】抢掠计划

Siruseri城中的道路都是单向的。不同的道路由路口连接。按照法律的规定，

Banditji 计划实施 Siruseri有史以来最惊天动地的 ATM 抢劫。他将从市中心

M行，每行两个整数，这两个整数都在 1到 N 之间，第i+1 行的两个整数表示第
i 条道路的起点和终点的路口编号。接下来 N 行，每行一个整数，按顺序表示每

P个有酒吧的路口的编号。

50%的输入保证 N,  M<=3000。所有的输入保证 N,  M<=500000。每个 ATM

6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1
5
1 4
4 3 5 6

47

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <map>

const long maxn = 500010;
const long MOD = 500010;
typedef long long ll;
long n;long m;
long S;long P;
long money[maxn];
long bar[maxn];
long DFN[maxn];
long LOW[maxn];
bool InStack[maxn];
long Stack[maxn];
long top  = 0;
long TIME = 0;
long Bcnt = 0;
long Belong[maxn];
long size[maxn];
long que[MOD];
bool vis[maxn];
long dist[maxn];
std::map<ll,bool> connected;
#define POS(a,b) (((ll)a-1)*(ll)m+(ll)b-1ll)
#define MIN(a,b) (a<b?a:b)
#define MAX(a,b) (a>b?a:b)

struct node
{
long index;
node* next;
};

void insert(long a,long b)
{
node* tmp = new node;
tmp->index = b;
}

void init()
{
scanf("%ld%ld",&n,&m);
for (long i=1;i<m+1;i++)
{
long a;long b;
scanf("%ld%ld",&a,&b);
insert(a,b);
}
for (long i=1;i<n+1;i++)
{
scanf("%ld",money+i);
}
scanf("%ld%ld",&S,&P);
for (long i=1;i<P+1;i++)
{
scanf("%ld",bar+i);
}
}

void tarjan(long u)
{
DFN[u] = LOW[u] = ++TIME;
InStack[u] = true;
Stack[++top] = u;
{
long v = next->index;
if (!DFN[v])
{
tarjan(v);
LOW[u] = MIN(LOW[u],LOW[v]);
}
else if(InStack[v])
{
LOW[u] = MIN(LOW[u],DFN[v]);
}
}
if (DFN[u] == LOW[u])
{
++Bcnt;
long v;
do
{
v = Stack[top--];
InStack[v]= false;
Belong[v] = Bcnt;
size[Bcnt]+=money[v];
}while(v != u);
}
}

void SPFA()
{
long l = 0;
long r = 0;
que[++r] = Belong[S];
while (l != r)
{
l = (l+1) % MOD;
long u = que[l];
vis[u] = false;
{
long v = vv->index;
if (dist[v]<dist[u]+size[v])
{
dist[v]=dist[u]+size[v];
if (!vis[v])
{
vis[v] = true;
r = (r+1) % MOD;
que[r] = v;
}
}
}
}
}

void insert2(long a,long b)
{
node* tmp = new node;
tmp->index = b;
}

void rebuild()
{
for (long u=1;u<n+1;u++)
{
{
long v = vv->index;
long B1 = Belong[u];
long B2 = Belong[v];
if (B1 != B2 && !connected[POS(B1,B2)])
{
connected[POS(B1,B2)] = true;
insert2(B1,B2);
}
}
}
}

int main()
{
freopen("atm.in","r",stdin);
freopen("atm.out","w",stdout);
init();
for (long i=1;i<n+1;i++)
if (!DFN[i]) tarjan(i);
rebuild();
SPFA();
long ans = 0;
for (long i=1;i<P+1;i++)
{
ans = MAX(ans,dist[Belong[bar[i]]]+size[Belong[S]]);
}
printf("%ld",ans);
return 0;
}


#### APIO2009 抢掠计划

2015-06-22 04:10:30

#### 【强连通分量】抢掠计划

2012-03-29 22:08:31

#### 【日常学习】【强连通分量tarjan缩点】codevs1611 抢掠计划题解

2015-10-16 18:34:04

#### 抢掠计划

2014-07-11 20:06:24

#### [bzoj 1179--Apio2009]Atm

2018-02-12 16:44:46

#### 队爷的讲学计划 （强连通缩点+最短路）

2016-11-03 17:15:53

#### 【APIO2009-3】抢掠计划

2018-02-01 20:39:46

#### 【APIO2009】【强连通分量】【DAG】抢掠计划

2013-04-10 21:36:31

#### bzoj1179: [Apio2009]Atm

2017-04-02 15:41:01

#### 非递归！APIO2009atm[抢掠计划]题解

2015-10-13 20:06:18

【强连通缩点+最长路】抢掠计划