题目大意
贝西(Bessie)在野外,想回到谷仓,以便在农夫约翰(Johner John)叫醒她早晨挤奶之前尽可能多地入睡。 贝西需要美睡,所以她想尽快回来。
农夫约翰的田地中有N(2 <= N <= 1000)个地标,唯一编号为1。 地标1是谷仓; Bessie整日站立的苹果树丛是地标N。奶牛使用地标之间长度各不相同的T(1 <= T <= 2000)双向奶牛场在田间旅行。 贝西对自己的导航能力不抱有信心,因此,从开始到结束,她始终处在步道上。
给定地标之间的路径,确定Bessie返回谷仓必须行走的最小距离。 可以保证存在这样的路由。
思路分析
最短路一遍过
#include<iostream>
#include<string.h>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
#define MAX 1005
#define ll int
#define p pair<int,int>
#define inf 1111111111
struct edge {
ll to, dis;
edge(ll a = 0, ll b = 0) { to = a, dis = b; }
};
bool operator < (const edge & e1, const edge & e2) {
return e1.dis > e2.dis;
}
ll T, N;
vector<edge> G[MAX];
ll vis[MAX], dist[MAX];
ll minCost(ll s, ll t) {
fill(dist + 1, dist + 1 + N, inf);
priority_queue<edge> q;
q.push(edge(s, 0));dist[s] = 0;
while (!q.empty()) {
ll id = q.top().to, d = q.top().dis; q.pop();
vis[id] = 1;
if (d < dist[id])continue;//过时数据
for (unsigned i = 0; i < G[id].size(); i++) {
edge e = G[id][i];
if (!vis[e.to] && dist[e.to] > dist[id] + e.dis) {
dist[e.to] = dist[id] + e.dis;
q.push(edge(e.to, dist[e.to]));
}
}
}
return dist[1];
}
int main() {
cin >> T >> N;
ll a, b, c;
for (int i = 1; i <= T; i++) {
cin >> a >> b >> c;
G[a].push_back(edge(b, c));
G[b].push_back(edge(a, c));
}
cout << minCost(N, 1) << endl;
}