没什么说的,就是裸的单源最短路算法。
AC代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 100 + 5;
bool vis[maxn];
struct Edge{
int from, to, dist;
Edge(){}
Edge(int x, int y, int cost):from(x), to(y), dist(cost){
}
};
vector<Edge>edges;
vector<int>G[maxn];
void add_edge(int x, int y, int cost) {
edges.push_back(Edge(x, y, cost));
G[x].push_back(edges.size()-1);
}
struct Node{
int d, u;
Node(){};
Node(int d, int u):d(d), u(u){}
bool operator < (const Node& p) const {
return d > p.d;
}
};
int d[maxn], n, m;
int disj() {
memset(vis, 0, sizeof(vis));
memset(d, inf, sizeof(d));
priority_queue<Node>Q;
d[1] = 0;
Q.push(Node(0, 1));
while(!Q.empty()) {
Node p = Q.top(); Q.pop();
int u = p.u;
if(u == n) return d[u];
if(vis[u]) continue;
vis[u] = 1;
for(int i = 0; i < G[u].size(); ++i) {
Edge &e = edges[G[u][i]];
if(d[e.to] > d[u] + e.dist){
d[e.to] = d[u] + e.dist;
Q.push(Node(d[e.to], e.to));
}
}
}
}
int main() {
while(scanf("%d%d", &n, &m) == 2 && n && m) {
for(int i = 0; i < maxn; ++i) G[i].clear();
edges.clear();
int x, y, cost;
for(int i = 0; i < m; ++i) {
scanf("%d%d%d", &x, &y, &cost);
add_edge(x, y, cost);
add_edge(y, x, cost);
}
printf("%d\n", disj());
}
return 0;
}
如有不当之处欢迎指出!