最短路徑
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...