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

来源:互联网 发布:java 读取文件流 编辑:程序博客网 时间:2024/06/15 06:16

题目: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 nodesdist[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++) {// 更新相邻节点 iif (!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 ************************/


1 0
原创粉丝点击