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

2021-10-23 04:18:35 字數 2531 閱讀 9804

c-tt的美夢

題目描述:

這一晚,tt 做了個美夢!

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

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

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

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

input:

第一行輸入 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 號點的最少稅費。

output:

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

sample input:25

6 7 8 9 10

61 2

2 33 4

1 55 4

4 5245

101 2 4 4 5 6 7 8 9 10

101 2

2 33 1

1 44 5

5 66 7

7 88 9

9 10

23 10

sample output:

case 1:34

case 2:??

思路:

本題結構中存在負權邊,dijkstra演算法無法使用,而bellman-ford演算法的複雜度又過高,所以用spfa演算法求帶負權邊的單源最短路。首先用前向星儲存邊,然後把起點壓入佇列進行spfa,spfa演算法思想是設立乙個先進先出的佇列q用來儲存待優化的結點,優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛操作,直至佇列空為止。時間複雜度為o(kn),k是平均頂點入隊次數。

總結:

鬆弛操作的原理是著名的定理:「三角形兩邊之和大於第三邊」,在資訊學中我們叫它三角不等式。所謂對結點i,j進行鬆弛,就是判定是否dis[j]>dis[i]+w[i,j],如果該式成立則將dis[j]減小到dis[i]+w[i,j],否則不動。

**:

#include

using

namespace std;

const

int inf=

0x0fffffff

;int head[

100010

],tot;

int t,n,m,a,b,q,p,op=0;

int dis[

100010

],a[

100010

],cnt[

100010];

bool vis1[

100010

],vis2[

100010];

struct edge

;edge e[

100010];

void

init()

void

add(

int x,

int y,

int w)

void

dfs(

int u)}}

intmain()

for(

int i=

1;i<=n;i++

) dis[i]

=inf;

dis[1]

=0; queue<

int> q;

q.push(1

);vis2[1]

=1;while

(!q.

empty()

)if(!vis2[e[i]

.to])}

}}cout<<

"case "

<":">q;

while

(q--)}

return0;

}

程式設計Week7 C TT的美夢

有n個城市,編號為1 n,每個城市有乙個繁榮程度,從城市a走到城市b,需要收取 b繁榮的 a繁榮度 3的稅,求從首都出發,到其他城市要交多少稅,若小於3或無法到達輸出 第一行輸入 t,表明共有 t 組資料。1 t 50 對於每一組資料,第一行輸入 n,表示點的個數。1 n 200 第二行輸入 n 個...

程式設計思維與實踐 Week7 作業

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...

程式設計思維與實踐 Week7 作業C SPFA

給定t組資料,每組資料有n個點和m條單向邊。每個點有乙個值,邊的權值即為終點的值減去起點值得三次方,求出從起點開始到每個點得最小權值和。由題意可知,圖中有負邊權,即有得點可能達不到,或者是處於負環路上。如果某個點不能達到或者是處於負環路,則輸出 第一行輸入 t,表明共有 t 組資料。1 t 50 對...