程式設計Week7 C TT的美夢

2021-10-05 03:59:56 字數 1568 閱讀 3833

有n個城市,編號為1~n,每個城市有乙個繁榮程度,從城市a走到城市b,需要收取(b繁榮的-a繁榮度)^3的稅,求從首都出發,到其他城市要交多少稅,若小於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 則輸出 『?』。

可以看出這是一道有向有權圖的單源最短路問題,但這道題的邊權是可以為負的,因此可能會出現負環,想到這裡,基本可以定下來使用spfa演算法,先將點加入佇列,再彈出隊首的點,遍歷與該點相連的點進行鬆弛,遇到負環時,就將負環內的所有點做標記(路徑長度為minn),其中負環根據當前所選擇的邊數進行判斷,因為一共只需選n-1條邊就能完成最短路,如果存在負環,邊數必然》=n,由此判斷負環即可。

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e7;

const

int minn=

-1e7

;struct edge

;vector g[

205]

;int n,m,q,p,t;

int a[

205]

,ans[

205]

,inq[

205]

,cnt[

205]

;queue<

int> q;

void

mark

(int v)

}void

spfa

(int s)

}else

mark

(v);}}

}}void

clear

(int n)

while

(!q.

empty()

) q.

pop();

}int

main()

cin>>q;

spfa(1

);cout<<

"case "

<1<<

":"

int j=

0;j++j)

}return0;

}

依然是一道單源最短路問題,但是要注意邊權的取值範圍,本題是可以去負值的,因此會出現負環,無法使用迪傑斯特拉演算法,改用spfa可以解決負環的問題,最後要注意的是這道題的輸出格式要求,讀題要仔細,測試要認真,不然就會pe(哭)。

程式設計思維與實踐 Week7 C TT的美夢

c tt的美夢 題目描述 這一晚,tt 做了個美夢!在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 n,其中 1 號城市是 tt 所在的城市,即首都。喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦...

week7 作業C TT的美夢

這一晚,tt 做了個美夢!在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 n,其中 1 號城市是 tt 所在的城市,即首都。喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出...

week7作業題 C TT 的美夢

這一晚,tt 做了個美夢!在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 n,其中 1 號城市是 tt 所在的城市,即首都。喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出...