哈理工oj 1348 最短路徑 (floyd演算法)

2021-07-03 09:39:25 字數 2147 閱讀 2581

最短路徑 

time limit: 1000 ms memory limit: 32767 k

total submit: 208(28 users) total accepted: 31(20 users) rating:  special judge: no

description

給出乙個有向帶權圖g,針對該圖有如下的兩種操作:

(1)標記該圖的乙個點

(2)找到兩點間的只通過已標記點的最短路徑長度

輸入:輸入包括多組測試,每組測試中第一行包括三個整數n,m,q,n表示圖中的節點數量,n<=300,

m表示邊的數量,m<=100000;q表示執行多少次操作,q<=100000,所有點被編號為0,1,2,...,n-1,

最初所有的點都是未標記的,接下來m行每行包括三個整數x,y,c,表示從x到y有一條邊長度為c,c>0,然

後為q行,每行表示一次操作,0 x表示將點x標記,1 x y表示查詢x到y的只通過已標記點的最短路徑長度,

n=m=q=0是輸入結束。

輸出:輸出以一行"case #:"開始,#表示為第幾組測試,從1開始

對於0 x操作,如果x已經被標記過了,輸出"error! at point x".

對於1 x y操作,如果x或y沒有被標記過,輸出"error! at path x to y",如果無法從x通過標記過的節

點到達y,輸出"no such path",否則輸出要求的最短路徑長度,每組測試後有乙個空行。

input

輸入包括多組測試,每組測試中第一行包括三個整數n,m,q,n表示圖中的節點數量,n<=300,

m表示邊的數量,m<=100000;q表示執行多少次操作,q<=100000,所有點被編號為0,1,2,...,n-1,

最初所有的點都是未標記的,接下來m行每行包括三個整數x,y,c,表示從x到y有一條邊長度為c,c>0,然

後為q行,每行表示一次操作,0 x表示將點x標記,1 x y表示查詢x到y的只通過已標記點的最短路徑長度,

n=m=q=0是輸入結束。

output

輸出以一行"case #:"開始,#表示為第幾組測試,從1開始

對於0 x操作,如果x已經被標記過了,輸出"error! at point x".

對於1 x y操作,如果x或y沒有被標記過,輸出"error! at path x to y",如果無法從x通過標記過的節

點到達y,輸出"no such path",否則輸出要求的最短路徑長度,每兩組測試之間有乙個空行。

sample input

5 10 10

1 2 6335

0 4 5725

3 3 6963

4 0 8146

1 2 9962

1 0 1943

2 1 2392

4 2 154

2 2 7422

1 3 9896

0 10 3

0 20 4

0 40 1

1 3 3

1 1 1

0 30 4

0 0 0

sample output

case 1:

error! at point 4

error! at point 1

0 0error! at point 3

error! at point 4

要懂得floyd演算法原理,對每個頂點 所有邊都要鬆弛一遍,那麼這是在所有邊都可訪問的情況下。對於這個題目,可以每次標記乙個點,都以這個點為中心鬆弛所有邊

[cpp] view plaincopy

#include#includeusing namespace std;

const int inf=304;

int g[inf][inf];

int vis[inf];

int main()

cout<<"case "<>x;

if(x)

else}}

}}

}cout<}

return 0;

}

OJ 1008 最短路徑問題

include using namespace std const int n 1001 const int inf 100000000 typedef struct map map ma n n map temp n void init int n void dijkstra int s,int ...

南陽oj 街道最短路徑問題

這個題目的思路是乙個數學歸納的思路 在一維座標系內,所有點到乙個點集合中某個點的距離和最短,那麼這個點自然可以滿足在這個維度下所有的點到它的距離和最短 所以如果有是二維座標系的話,把每乙個維度下的那個所有點到那個點距離最短的點求出來,就組成了最後符合題意的郵局的座標 ac 如下 include in...

入門OJ 最短路徑樹入門

n 100,1 m 3000,1 len 10000。顯然,對於乙個點u,如果刪去的邊不在它到其它點的最短路上,那麼s是不會變的。考慮到兩點之間的最短路不止一條,我們可以給每個點先建出一棵最短路徑樹出來,然後列舉最短路徑樹上的每條邊並把它刪掉,再跑一遍最短路,看s是否變大即可。如果最短路用dijks...