首页 > 其他 > 详细

SRM 573 D1L2:SkiResorts,最短路径算法

时间:2014-03-04 16:27:38      阅读:419      评论:0      收藏:0      [点我收藏+]

题目:http://community.topcoder.com/stat?c=problem_statement&pm=12468&rd=15493

题目的难点是要把题目转化成求解最短路径模型。参考一位大牛的话:

Make the pair: (hill, altitude) to represent a node.


you need to find the shortest path from


(0, any_altitude) to (n-1, any_altitude)


Next trick is to observe the altitudes that matter are the ones from vector A (altitudes).


Now a node is (hill, j) (you are at hill with Altitude A[j]). Run the your shortest path algorithm...


代码:

#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>

#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>

#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;

#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> pll;
#define mkp make_pair

/*************** Program Begin **********************/
int g[55][55];
const long long INF = (1LL << 60);
long long dist[51][51]; // dist[i][j] 表示 节点(0, 0) 至 (i, j)的最短距离
class SkiResorts {
public:
	vector <int> altitude;
	inline int distance(int i, int j) {return abs(altitude[i] - altitude[j]);}
	long long minCost(vector <string> road, vector <int> altitude) {
		long long res = INF;
		this->altitude = altitude;
		int n = road.size();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (road[i][j] == ‘Y‘) {
					g[i][j] = 1;
				} else {
					g[i][j] = 0;
				}
				dist[i][j] = INF;
			}
		}
		// Dijk 算法
		set < pair<int, pii> > S;
		for (int i = 0; i < n; i++) {
			// add start nodes
			dist[0][i] = distance(0, i);
			S.insert( mkp(dist[0][i], mkp(0, i)) );
		}
		pair<int, pii> cur;
		while (!S.empty()) {
			cur = *S.begin();
			S.erase(S.begin());
			int p = cur.second.first;
			int h = cur.second.second;
			for (int i = 0; i < n; i++) {
				// 更新相邻节点 i
				if (!g[p][i]) { continue; }
				for (int j = 0; j < n; j++) {	// (p, h) -> (i, j)
					if (altitude[h] >= altitude[j] && 
					    dist[i][j] > dist[p][h] + distance(i, j) ) {
						S.erase(mkp(dist[i][j], mkp(i, j)));
						dist[i][j] = dist[p][h] + distance(i, j);
						S.insert(mkp(dist[i][j], mkp(i, j)));
					}
				}
			}
		}
		for (int i = 0; i < n; i++) {
			res = min(res, dist[n-1][i]);
		}
		res = (res == INF ? -1 : res);
		return res;
	}

};

/************** Program End ************************/


SRM 573 D1L2:SkiResorts,最短路径算法,布布扣,bubuko.com

SRM 573 D1L2:SkiResorts,最短路径算法

原文:http://blog.csdn.net/xzz_hust/article/details/20392187

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!