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

2021-10-04 19:26:37 字數 2100 閱讀 2971

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

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

樣例:

2

56 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

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

樣例:

case 1:34

case 2:

??

首先根據題意肯定是求最短路徑得題目,然後邊權是隱式給出得,根據題目,可知,邊權中有負邊,故需要用spfa演算法來計算。即從起點開始,進行一邊spfa演算法,演算法和dij演算法相似,多了乙個cnt陣列來儲存到達每乙個點的時候所走的邊的數量。其餘更新dis的路徑長度和dij演算法相似。在更新時,同步更新cnt。同時易知,在n個點的圖中,若到達任一點所走的邊數如果大於n,則一定是有負環路。則在此處,對所有在負環路上和負環路所影響的點都不能正確到達。即這些點要輸出「?」。即對出現這種點的時候,從這個點開始進行一遍bfs,標記這個點所能到達的所有的點,(我標記為-1),此後在查詢輸出的時候,若這個點的dis值無窮大,說明不能到達這個點,若這個點的值小於3,(此題認為小於3即不符合要求),同樣輸出「?」,其餘的輸出查詢所得的dis值即可。

#include 

#include

#include

#include

#include

#include

using namespace std;

const int inf = 1e8;

int t,n,m,q,p;

bool vis[205]

; //記錄當前是否在佇列中

int dis[205]

; //花費

int cnt[205]

; //記錄邊數

int a[205]

; //每個點的值

struct edge e[200010]

;int head[205]

;int tot;

queue q; //最大堆

void add_edge(int t, int f, int w)

queue q2;

bool vis2[205]

; void bfs(int x)

i = e[i].next;}}

}void spfa(

) dis[1]

= 0, vis[1]

=1; q.push(1)

;while

(q.size(

))else if(dis[t1]

!=-1 && vis[t1]

==0)

} i = e[i].next;}}

}int main()

cin>>m;

int x,y;

for(int j=1;j<=m;j++)

spfa();

cout<<

"case "

<":">q;

for(int j=0;jelse}}

return 0;

}

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

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

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

b題 倒水問題 bfs 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,...

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

b 區間選點 貪心 c 區間覆蓋問題 貪心 給出n個正數,從其中選出k個數,使其總和為s,問 有多少種選數方案?input 第一行是正數t t 100 表示測試的組數。每一組都輸入兩行,第一行是三個整數n,k,s,第二行是n個正整數。output 每一組輸出結果佔一行,為方案的數目。sample i...