OR51. 航线
描述
“呼!!终于到了,可是接下来要怎么走才能到达楚楚街港港呢?”亮亮在醋溜港直发愁。 突然“啾”的一下,一只银色小船出现在亮亮的面前,上面坐着小精灵丹丹“又见面了,有什么可以帮助你的么?”小精灵向亮亮眨了眨眼睛,微笑着说。 “我想去楚楚街港,但我不知道要怎么走,请问你可以告诉我么?”亮亮按捺着激动的心情轻声问道。 “楚楚街港呀......那是个特别美好的地方”小精灵歪着头想了想,说“我只能告诉你大海上所有的航线,剩下的就只能靠你自己啦~” “只有所有的航线呀”,亮亮的内心再三挣扎,却又没有其他的办法。 “不管有多困难,我一定要达到楚楚街港,请你告诉我吧”亮亮坚定地对小精灵说。 小精灵欣赏地点了点头,递给亮亮一张航线图,并叮嘱道“时限是1000天,一定要到哦~”,然后如来时一般“啾”的一声,消失了。 亮亮现在迫切地想要抵达楚楚街港,请问亮亮最快能在第几天抵达楚楚街港呢?输入描述
一行包含两个整数N(2<=N<=500),M(1<=M<=2000),用单个空格隔开。表示公有N个港,M条航线。起点为1,终点为N。 接下来M行,每行包含五个整数P,Q(1<=P,Q<=n), K(1<=K<=1000), X,Y(0<=X,Y<=10000),代表P,Q两个港有航线并需要K天,并且该航线在第X天到第Y天天气恶劣不可通行。输出描述
一个整数,即亮亮最快能在第几天抵达楚楚街港示例1
输入:
4 4 2 1 1 7 13 4 3 2 10 11 1 3 8 9 12 2 3 3 2 10
输出:
14
C++ 解法, 执行用时: 1ms, 内存消耗: 248KB, 提交时间: 2017-06-11
#include<iostream> #include<vector> #include<cmath> using namespace std; #define INF 2000 struct Node{ int x, y; int k; Node() { k = INF; } }; int main() { int N, M,result; while (cin >> N >> M) { vector<vector<Node>> map(N+1, vector<Node>(N+1)); for (int i = 0;i < M;i++) { int p, q, k, x, y; cin >> p >> q >> k >> x >> y; map[p][q].x = x; map[p][q].y = y; map[p][q].k = k; map[q][p] = map[p][q]; } vector<int> visted(N + 1,0), cost(N + 1,INF); for (int i = 1;i < N + 1;i++) { if (map[1][i].k != INF) { if (map[1][i].k < map[1][i].x) cost[i] = map[1][i].k; else cost[i] = map[1][i].y + map[1][i].k; } } cost[1] = 0; for (int i = 2;i < N+1;i++) { int min = INF,pos; for (int j = 1;j < N + 1;j++) { if (visted[j] == 0 && cost[j] < min) { min = cost[j]; pos = j; } } visted[pos] = 1; for (int j = 1;j < N + 1;j++) { if (visted[j] == 0) { int temp; if (((map[pos][j].k + cost[pos]) < map[pos][j].x) || (cost[pos] + 1 > map[pos][j].y)) temp = cost[pos] + map[pos][j].k; else temp = map[pos][j].y + map[pos][j].k; if (temp < cost[j]) { cost[j] = temp; } } } } cout << cost[N] + 1 << endl; } return 0; }
C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2017-06-24
#include<stdio.h> #include<vector> using namespace std; #define INF 1005 struct route{ int x,y; int k; //routes[i][j] 表示从i港口到j港口需要k天,其中第x到第y天禁止通行 route(){ k = INF; } }; int dijstra(int n, vector<vector<route>> &routes){ vector<int> time(n+1, INF); //time[i] 表示从1号港口到i号港口需要几天 for(int i = 1; i <= n; i++){ if(routes[1][i].k != INF){ if(routes[1][i].k < routes[1][i].x){ time[i] = routes[1][i].k; //初始化time数组 } else time[i] = routes[1][i].y + routes[1][i].k; } } routes[1][1].k = 1; for(int p = 1; p <= n; p++){ int min = INF; int j = -1; for(int i = 1; i <= n; i++){ if(routes[i][i].k != 1 && time[i] < min){ min = time[i]; j = i; } } if(j == -1) break; else{ routes[j][j].k = 1; for(int i = 1; i <= n; i++){ if(routes[i][i].k != 1){ int temp; if(routes[j][i].k+time[j] < routes[j][i].x || time[j] >= routes[j][i].y){ //行程中没有遇到恶劣天气 temp = time[j] + routes[j][i].k; } else temp =routes[j][i].y + routes[j][i].k; if(temp < time[i]) time[i] = temp; } } } } return time[n]+1; } int main(){ int n, m,p,q,k,x,y; scanf("%d%d", &n,&m); vector<vector<route>> routes(n+1, vector<route>(n+1)); for(int i = 0; i < m; i++){ scanf("%d%d%d%d%d", &p, &q, &k, &x, &y); routes[p][q].k = k; routes[p][q].x = x; routes[p][q].y = y; routes[q][p] = routes[p][q]; } printf("%d\n", dijstra(n, routes)); }