2387 Til the Cows Come Home:

题目大意

贝西(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;
}
发布了211 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105338964