1. 程式人生 > >洛谷 P2299 Mzc和體委的爭奪戰

洛谷 P2299 Mzc和體委的爭奪戰

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^5n2500m2?105

由於mzc大大十分著急,所以他只能等待1s。

思路:單源最短路(我一般用SPFA) 難度:普及/提高-

#include<algorithm>
#include<cstdio>
#include<queue>
#define MAXN 0x7fffffff
#define
M 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和體委的爭奪戰