SDUT 2622 最短路徑

2021-08-01 23:56:32 字數 1554 閱讀 5675

最短路徑

time limit: 1000ms memory limit: 65536kb

submit statistic discuss

problem description

為了準備一年一度的校賽,大家都在忙著往賽場搬運東西,比如氣球什麼的。這時 yy 也沒有閒著,他也加入了搬運工的行列。已知學校有 n 個路口和 m 條路,yy 並不是把東西直接搬到賽場,而是從 s 路口搬運到 t 路口。由於 yy 非常懶而且他有輕度強迫症。所以他要走的路需要盡可能的短,並且走過路徑的數目要為 x 的倍數。

input

輸入的第一行為乙個正整數t(1 ≤ t ≤ 20),代表測試資料組數。

對於每組測試資料:

輸入的第一行為兩個正整數 n 和 m(1 ≤ n ≤ 100, 1 ≤ m ≤ 10000)。

接下來m行每行三個正整數 u、v、w(0 ≤ u, v < n, 0 ≤ w ≤ 230 ),代表有一條從u到v的長度為w的有向路徑。

最後一行為三個正整數s、t 、x(0 ≤ s, t < n, 1 ≤ x ≤ 10)。

output

對於每組測試資料,輸出滿足條件的從 s 到 t 的最短路徑。如果從 s 到 t 不可達,或者無法滿足路徑數是 x 的倍數,輸出「no answer!」(不包含引號)。

注意:64-bit 整型請使用 long long 來定義,並且使用 %lld 或 cin、cout 來輸入輸出,請不要使用 __int64 和 %i64d。

example input

22 1

0 1 1

0 1 2

3 20 1 1

1 2 1

0 2 2

example output

no answer!

#include #define n 110

#define inf long_long_max

using namespace std;

struct info

tmp;//vector前向星存圖

void start();//初始化的一些操作,為dis陣列賦初值

void clear();//結束時記得清零vector

void spfa();

int n, m, s, t, x;

int vis[n];//標記是否已經訪問

long long int dis[n][12];// dis 有兩個維度,dis[i][j] 表示i點到s點步數%x為j的最短路徑長度(有點繞,仔細琢磨一下)

vector map[n];//存圖

int main()

scanf("%d%d%d", &s, &t, &x);

spfa();

if(dis[t][0] >= inf)//當到t點步數%x為零(x的倍數)的最短路徑存在時輸出

else

clear();

}return 0;

}void start()

}}void clear()

}void spfa()}}

}}

}

SDUT2143最短路徑

time limit 1000ms memory limit 65536k 有疑問?點這裡 給定乙個帶權無向圖,求節點1到節點n的最短路徑。輸入包含多組資料,格式如下。第一行包括兩個整數n m,代表節點個數和邊的個數。n 100 剩下m行每行3個正整數a b c,代表節點a和節點b之間有一條邊,權值...

SDUT 1867 最短路徑問題

time limit 1000ms memory limit 65536kb problem description 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離...

BZOJ2622 深入虎穴(最短路徑)

如果對某個點能求出與其相鄰的所有點到達出口的最短時間,那麼該點的答案就可以在其中取次小值了。對於dijkstra魔改一下就能做到這個。初始時將所有出口的最短時間設為0並放入堆,記錄最短和次短路徑,每個點更新後將次短路徑入堆。include include include include includ...