1399 坐船旅行

2021-10-07 04:19:19 字數 2268 閱讀 3596

題目描述

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...