洛谷 P2299 Mzc和體委的爭奪戰
阿新 • • 發佈:2018-03-24
gpo emp class pri 輸入輸出格式 鄰接鏈表 set i++ bad
洛谷 P2299 Mzc和體委的爭奪戰
題目背景
mzc與djn第四彈。
題目描述
mzc家很有錢(開玩笑),他家有n個男家丁(做過前三彈的都知道)。但如此之多的男家丁吸引來了我們的體委(矮胖小夥),他要來與mzc爭奪男家丁。
mzc很生氣,決定與其決鬥,但cat的體力確實有些不穩定,所以他需要你來幫他計算一下最短需要的時間。
輸入輸出格式
輸入格式:
第一行有兩個數n,m.n表示有n個停留站,m表示共有m條路。
之後m行,每行三個數a_i \; b_i \; c_iai?bi?ci? ,表示第a_iai? 個停留站到第b_ibi? 個停留站需要c_ici? 的時間。(無向)
輸出格式:
一行,輸出1到n最短時間。
輸入輸出樣例
輸入樣例#1: 復制5 8 1 2 3 2 3 4 3 4 5 4 5 6 1 3 4 2 4 7 2 5 8 1 5 100輸出樣例#1: 復制
11
說明
n \leq 2500\;m \leq 2*10^5n≤2500m≤2?105
由於mzc大大十分著急,所以他只能等待1s。
思路:單源最短路(我一般用SPFA) 難度:普及/提高-
#include<algorithm> #include<cstdio> #include<queue> #define MAXN 0x7fffffff #defineM 200005 using namespace std; queue<int> q; int n, m, k; int tot; int dis[M], vis[M]; int to[M*2], net[M*2], head[M*2], cap[M*2]; //無向圖,開兩倍 void add(int u, int v, int w) { //數組儲存鄰接鏈表 to[++tot] = v; net[tot] = head[u]; head[u] = tot; cap[tot] = w; to[++tot] = u; net[tot] = head[v]; head[v] = tot; cap[tot] = w; }void spfa(int x) { //SPFA函數 for(int i = 1; i <= n; i++) vis[i] = 0, dis[i] = MAXN; //初始化 vis[x] = 1; dis[x] = 0; q.push(x); while(!q.empty()) { int y = q.front(); q.pop(); vis[y] = 0; for(int i = head[y]; i; i = net[i]) { int t = to[i]; if(dis[t] > dis[y]+cap[i]) { dis[t] = dis[y]+cap[i]; if(!vis[t]) vis[t] = 1, q.push(t); } } } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c); } spfa(1); printf("%d", dis[n]); return 0; }
洛谷 P2299 Mzc和體委的爭奪戰