強連通縮點 最長路 搶掠計畫

2021-06-05 09:27:02 字數 2577 閱讀 2034

搶掠計畫

siruseri城中的道路都是單向的。不同的道路由路口連線。按照法律的規定,

在每個路口都設立了乙個 siruseri 銀行的 atm 取款機。令人奇怪的是,siruseri

的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。

banditji 計畫實施 siruseri有史以來最驚天動地的 atm 搶劫。他將從市中心

出發,沿著單向道路行駛,搶劫所有他途徑的atm 機,最終他將在乙個酒吧慶

祝他的勝利。

使用高超的黑客技術,他獲知了每個atm 機中可以掠取的現金數額。他希

望你幫助他計算從市中心出發最後到達某個酒吧時最多能搶劫的現金總數。他可

以經過同一路口或道路任意多次。但只要他搶劫過某個 atm 機後,該 atm 機

裡面就不會再有錢了。

例如,假設該城中有6個路口,道路的連線情況如下圖所示: 

市中心在路口 1,由乙個入口符號→來標識,那些有酒吧的路口用雙圈來表

示。每個atm機中可取的錢數標在了路口的上方。在這個例子中,banditji 能搶

劫的現金總數為47,實施的搶劫路線是:1-2-4-1-2-3-5。

輸入格式

第一行包含兩個整數 n、m。n 表示路口的個數,m表示道路條數。接下來

m行,每行兩個整數,這兩個整數都在 1到 n 之間,第i+1 行的兩個整數表示第

i 條道路的起點和終點的路口編號。接下來 n 行,每行乙個整數,按順序表示每

個路口處的atm機中的錢數。接下來一行包含兩個整數 s、p,s表示市中心的

編號,也就是出發的路口。p表示酒吧數目。接下來的一行中有 p個整數,表示

p個有酒吧的路口的編號。

輸出格式

輸出乙個整數,表示 banditji 從市中心開始到某個酒吧結束所能搶劫的最多

的現金總數。

資料範圍

50%的輸入保證 n,  m<=3000。所有的輸入保證 n,  m<=500000。每個 atm

機中可取的錢數為乙個非負整數且不超過 4000。輸入資料保證你可以從市中心

沿著siruseri的單向的道路到達其中的至少乙個酒吧。

輸入樣例

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 和上一道題如出一轍,此題是乙個簡化版本,不用再贅述。

只是因為ans = max(ans,dist[belong[bar[i]]]+size[belong[s]]);  

打成了ans = max(ans,dist[bar[i]]+size[belong[s]]);    而悲劇地爆零了

#pragma comment(linker, "/stack:1024000000,1024000000") 

#include #include 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::mapconnected;

#define pos(a,b) (((ll)a-1)*(ll)m+(ll)b-1ll)

#define min(a,b) (ab?a:b)

struct node

;node* head[maxn];

node* head2[maxn];

void insert(long a,long b)

void init()

else if(instack[v])

}if (dfn[u] == low[u])

while(v != u); }}

void spfa()

void rebuild()

} }}int main()

{ freopen("atm.in","r",stdin);

freopen("atm.out","w",stdout);

init();

for (long i=1;i

POJ 3592(強連通縮點,拓撲最長路)

題意 n m矩陣,表示傳送門,矩陣後面給出其到達的點,障礙點,不可到達,數字表示該點的寶藏數,每個點可以往下或者往右走,獲得寶藏後該點寶藏數變為0,問最多能獲得多少寶藏。思路 建圖 強連通縮點 拓撲dp。難點 構圖 點不可做為起點也不可以作為終點。總共n m個點,標號別和其他量弄混。強連通縮點 只對...

模板 強連通縮點

直接給他縮點然後求新的圖的完整版 c2 u 表示縮點後的u點這個環上的點實際上是哪些 g3 u 表示縮點後的u點的出邊 還是一樣,要記得先處理入鏈。可以讓這個圖好看一點但是沒啥鳥用 入鏈可能會有一些特別的性質,當然假如入鏈沒有特別性質也可以直接縮點。不對其實直接縮點就可以了,入鏈還是新圖的入鏈,環是...

強連通分量 搶掠計畫

siruseri城中的道路都是單向的。不同的道路由路口連線。按照法律的規定,在每個路口都設立了乙個siruseri銀行的atm取款機。令人奇怪的是,siruseri的酒吧也都設在路口,雖然並不是每個路口都設有酒吧。banditji計畫實施siruseri有史以來最驚天動地的atm搶劫。他將從市中心出...