TT 的美夢(SPFA判負環)

2021-10-04 16:45:44 字數 2878 閱讀 3509

這一晚,tt 做了個美夢!

在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 ~ n,其中 1 號城市是 tt 所在的城市,即首都。

喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出了乙個解決方案!tt 欣然接受並針對該方案頒布了一項新的政策。

具體政策如下:對每乙個商業城市標記乙個正整數,表示其繁榮程度,當每乙隻喵沿道路從乙個商業城市走到另乙個商業城市時,tt 都會收取它們(目的地繁榮程度 - 出發地繁榮程度)^ 3 的稅。

tt 打算測試一下這項政策是否合理,因此他想知道從首都出發,走到其他城市至少要交多少的稅,如果總金額小於 3 或者無法到達請悄咪咪地打出 『?』。

第一行輸入 t,表明共有 t 組資料。(1 <= t <= 50)

對於每一組資料,第一行輸入 n,表示點的個數。(1 <= n <= 200)

第二行輸入 n 個整數,表示 1 ~ n 點的權值 a[i]。(0 <= a[i] <= 20)

第三行輸入 m,表示有向道路的條數。(0 <= m <= 100000)

接下來 m 行,每行有兩個整數 a b,表示存在一條 a 到 b 的有向道路。

接下來給出乙個整數 q,表示詢問個數。(0 <= q <= 100000)

每一次詢問給出乙個 p,表示求 1 號點到 p 號點的最少稅費。

每個詢問輸出一行,如果不可達或稅費小於 3 則輸出 『?』。

256

78910

6122

3341

5544

5245

10124

4567

89101012

2331

1445

5667

7889

91023

10

case 1:3

4case 2:?

?

題目要求1到其他點需要花費最少的錢,相當於從1向其他點求最短路。

每個城市都有乙個繁榮程度權值,並且兩個城市之間的路徑是輸入的,說明這個題變成了含有負權邊的有向圖單源最短路問題。

接下來我們看一下輸出,什麼時候輸出『?』。有以下幾種情況:

無法到達(這個地方很重要,最後輸出不要忘記判斷,我白白wa了兩次)

交稅小於3

a. 最短路存在,但是值小於3

b. 最短路不存在,出現了負環,交稅變成了負數

我們需要找含有負環的連通圖,通過這些負環的連通圖均不可到達 。

首先利用spfa來從1號城市開始搜尋,如果發現到達某乙個城市經過的邊數超過n-1,那就說明出現了負環,然後從這個點開始搜尋,到達的路徑都標記上,這些點最後要輸出『?』。

ps:這個題肯定還有別的做法,如果我能想起來,有空就寫上。

//#pragma gcc optimize(2)//比賽禁止使用!

//#pragma g++ optimize(2)

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

100000+10

;const

int maxm=

200+10;

struct node

;node edge[maxn]

;int t,n,m,q,head[maxn]

,a[maxm]

,len,vis[maxm]

,dis[maxm]

,cnt[maxm]

;bool flag[maxm]

;//統計負環所在的連通圖

void

add(

int x,

int y,

int w)

void

find_negative_ring

(int s)

//乙個普通的搜尋}}

}void

spfa

(int s)

//起始點加入佇列

dis[s]=0

; vis[s]=1

; q.

push

(s);

while

(!q.

empty()

) dis[y]

=dis[x]

+edge[i]

.w;if

(vis[y]==0

&&!flag[y])}

}}}int

getint()

while

(ch>=

'0'&& ch<=

'9')

return x*s;

}int

main()

spfa(1

);printf

("case %d:\n"

,tt)

; q=

getint()

;for

(int i=

1; i<=q; i++

) len=0;

memset

(a,0

,sizeof

(a))

;memset

(head,0,

sizeof

(head));

}return0;

}

模板 Spfa判負環

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你判斷圖中是否存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 如果圖中存在負權迴路,則輸出 yes 否則輸出 no 資料範圍 1 n 20...

spfa(判負環變形)

題目鏈結 題意 n種貨幣,m種交換 s v 邊 u v r1 c1 r2 c2表示u貨幣換成v貨幣需要c1手續費和交換率r1,v換u為c2,r2.轉換公式 val v val u c1 r1 初始有s貨幣v枚。問能否通過一系列的交換,可以獲得比初始更多的錢?解法 include include in...

spfa演算法及判負環詳解

spfa shortest path faster algorithm 是一種單源最短路徑的演算法,基於bellman ford演算法上由佇列優化實現。也就是說,bellman ford是一種無腦,瘋狂鬆弛的演算法。其複雜度為o nm 可想而知,對於上萬的資料會炸的一塌糊塗。相對而言,spfa顯得就...