題目描述
noip有n個島嶼,編號為1…n,noip決定在島嶼之間發展船運網路。,
你在船運票務中心工作,很多人想花盡量少的錢從乙個島到另乙個島進行坐船旅行,他們每個人都報上自己的出發地和目的地,你的任務是告訴他最小花費。
但是在這個過程中船的航線不會一直不變,可能會在某個時候增加一些航線,這些新增加的航線顯然對之前的詢問沒有作用,但對之後的詢問就要考慮到這些航線了。
按照時間先後的順序給你乙個清單,裡面包含詢問以及增加航線的資訊,寫乙個程式回答遊客提出的問題。
輸入
第1行:兩個數 n(1<=n<=100) 和 k(1<=k<=5000),分別表示島嶼的數量以及清單的長度。
下面k行描述清單內容,有兩種:
(1)格式為0 a b(1<=a<=n,1<=b<=n,a<>b)表示遊客詢問島a到島b的最小費用;
(2)1 a b e(1<=a,b<=n,a<>b,1<=e<=1000000)表示在a到b之間新增一條航線,費用為e,注意航線都是雙向的。
一開始,沒有任何航線,並且總的航線數不超過1000,兩個島之間可能有多條航線。
輸出
對於每個詢問輸出對應的最小費用。
樣例輸入
樣例輸入1:
381
31100
2312
32011
2503
2113
7121
9023
樣例輸入2:
5161
1234375011
3334311
434739211
5549712
312339412
454549212
545813
434398313
584346814
51593402
1041
0320
4204
3053
樣例輸出
樣例輸出1:
-115
12
樣例輸出2:
5955
21431
9298
16392
24774
8840
資料範圍限制
提示
思路:
我們對於這麼大的值,並且是最短路,那第一時間就想到了spfa。但是呢,題目說明對於每兩個點之間可能會有多條路,如何去一條最短的呢?
其實我們只需用乙個陣列來記錄以前的值,最後每想加路時,都需做乙個比較,然後就解決了。
#include
#include
#include
#include
#include
#include
#include
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using
namespace std;
const
int max=
2147483647
;const
int n=
1e6;
struct node
edge[
10010];
int n,k,tot,hd[
10010
],q[
10010
],minn[
10010
],jl[
110]
[110];
bool f[
10010];
void
add(
int u,
int v,
int w)
}void
spfa
(int s)
} f[tx]=0
;}}int
main()
}return0;
}
2012 03 3普及組 坐船旅行
題目描述 noip有n個島嶼,編號為1.n,noip決定在島嶼之間發展船運網路。你在船運票務中心工作,很多人想花盡量少的錢從乙個島到另乙個島進行坐船旅行,他們每個人都報上自己的出發地和目的地,你的任務是告訴他最小花費。但是在這個過程中船的航線不會一直不變,可能會在某個時候增加一些航線,這些新增加的航...
計算1 3 99的和
public class oddsum system.out.println result result 總結 1.空格的使用 一般等號兩邊都要加空格,這樣會增加程式的可讀性 但是也不是絕對的,例如for迴圈中 兩邊加空格反而顯得很累贅 因此寫程式要靈活,要寫出可讀性強的 2.要成良好的變成習慣。3...
BJFU 1399 警察抓小偷
時間限制 c c 5000ms 10000ms 執行記憶體限制 65536kbyte 總提交 12 測試通過 4 描述 警察知道小偷的位置,想要抓住它。警察和小偷都位於數軸上,警察起始位於點n 0 n 100000 小偷位於點n 0 k 100000 警察有兩種移動方式 1 從x移動到x 1或x 1...