标签:std const \n als queue spfa cow scan 开始
题目
题目描述
贝茜在谷仓外的农场上,她想回到谷仓,在第二天早晨农夫约翰叫她起来挤奶之前尽可能多地睡上一觉.由于需要睡个好觉,贝茜必须尽快回到谷仓.农夫约翰的农场上有N(2≤N≤1000)个路标,每一个路标都有唯一的编号(1到N).路标1是谷仓,路标N是贝茜一整天呆在那里的果树园.农场的所有路标之间共有T(1≤T≤2000)条不同长度的供奶牛走的小路(无方向).贝茜对她识别方向的能力不是很自信,所以她每次总是从一条小路的头走到尾,再以这条路的尾作为下一条路的头开始走. 现给出所有路标之间的小路,要求输出贝茜回到谷仓的最短路程(每组输入数据都保证有解).
输入
第1行:2个整数T和N.
第2到T+1行:每行用空格隔开的三个整数描述一条小路.前两个整数是这条小路的尾和头,
第三个整数是这条小路的长度(不大于100).
输出
一个整数,表示贝茜从路标N到路标1所经过的最短路程
样例输入
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
样例输出
90
分析
spfa裸题。
链式前向星存图,spfa跑一遍完事。
上代码。
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int N = 10010; const int M = 40010; int n, m; int head[N], nex[M], to[M], val[M], ce; void add(int u, int v, int w) { to[++ce] = u; nex[ce] = head[v]; head[v] = ce; val[ce] = w; to[++ce] = v; nex[ce] = head[u]; head[u] = ce; val[ce] = w; } int d[N]; bool used[N]; queue<int> q; void spfa(int s) { memset(d, 0x3f, sizeof d); d[s] = 0; q.push(s); used[s] = true; while(!q.empty()) { int u = q.front(); q.pop(); used[u] = false; for(int i=head[u]; i; i=nex[i]) { int v = to[i], w = val[i]; if(d[u] + w < d[v]) { d[v] = d[u] + w; if(!used[v]) { used[v] = true; q.push(v); } } } } } int main() { scanf("%d%d", &m, &n); for(int i=1; i<=m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); add(u, v, w); } spfa(1); printf("%d\n", d[n]); return 0; }
标签:std const \n als queue spfa cow scan 开始
原文地址:https://www.cnblogs.com/DWVictor/p/10325949.html