日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划训练19、最短路 [Help Jimmy POJ - 1661 ] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Help Jimmy

? POJ - 1661?

題意:大致是一個人從某個點開始下落,下落的速度是1m/s,然后在平臺上的時候可以左右移動,移動的速度也是1m/s,但是這里有一個限制,就是說每次下落的距離不能超過一個給定的數值。問你從起始點下落到地板最少需要多少s。

題解,這道題我看到的時候第一感覺是最短路,建圖方法就是對于每一個平臺的兩個端點(編號為2*i+1和2*i+2),考慮這個從端點所能下落到的下一個平臺的兩個端點,比如,根據上一個平臺的某個端點到下一個最近的平臺的兩個端點所需要的時間來建立邊(邊權就是耗費的時間)

最后別忘了從起點開始的建邊以及端點到地板的建邊!

動態規劃的做法等會了再補上

#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <queue> #include <cstring> using namespace std; #define int long long const int MAXN = 2005; const int INF = 1e18; int N,X,Y,MAX; //int G[MAXN][MAXN]; //vector<int> G[MAXN]; int head[MAXN]; struct edge{int v;int next;int cost; }Es[MAXN<<1]; int d[MAXN]; int cnt; typedef pair<int,int> P; struct node{int x1,x2,h;friend bool operator<(node n1,node n2){return n1.h > n2.h;} }; node ns[MAXN]; void dijkstra(int x){for(int i = 0;i <= MAXN;i++)d[i] = INF;d[x] = 0;priority_queue<P,vector<P>,greater<P> > que;que.push(P(0,x));while(!que.empty()){P p = que.top();que.pop();int dis = p.first;int v = p.second;if(d[v] < dis) continue;//for(int i = 0;i < 2*N+2;i++){for(int e = head[v];e!= -1;e = Es[e].next){int cost = Es[e].cost;int i = Es[e].v;if(cost + d[v] < d[i]){d[i] = d[v] + cost;que.push(P(d[i],i));}}} } inline void add_edge(int i,int j,int cost){//G[i][j] = cost;Es[cnt].v = j;Es[cnt].cost = cost;Es[cnt].next = head[i];head[i] = cnt++; } void init(){cnt = 0;memset(head,-1,sizeof(head)); } main(){int t;scanf("%lld",&t);while(t--){init();scanf("%lld%lld%lld%lld",&N,&X,&Y,&MAX);for(int i = 0;i < N;i++){int x1,x2,h;scanf("%lld%lld%lld",&x1,&x2,&h);ns[i].x1 = x1;ns[i].x2 = x2;ns[i].h = h;}sort(ns,ns+N);//create graphfor(int i = 0;i < N;i++){int l = 0,r = 0;int f = 1;for(int j = i + 1;j < N;j++){if(ns[i].h - ns[j].h > MAX){f = 0;break;}if(!l && ns[i].x1 >= ns[j].x1 && ns[i].x1 <= ns[j].x2){l = 1;add_edge(2*i+1,2*j+1,ns[i].h - ns[j].h + ns[i].x1 - ns[j].x1);add_edge(2*i+1,2*j+2 ,ns[i].h - ns[j].h + ns[j].x2 - ns[i].x1);}if(!r && ns[i].x2 >= ns[j].x1 && ns[i].x2 <= ns[j].x2){r = 1;add_edge(2*i+2,2*j+1,ns[i].h - ns[j].h + ns[i].x2 - ns[j].x1);add_edge(2*i+2,2*j+2,ns[i].h - ns[j].h + ns[j].x2 - ns[i].x2);}if(r && l) break;}if(!f)continue; if(!l && ns[i].h <= MAX){add_edge(2*i+1,2*N+1,ns[i].h);}if(!r && ns[i].h <= MAX){add_edge(2*i+2,2*N+1,ns[i].h);}}int f = 0;for(int i = 0;i < N;i++){if(X > ns[i].x1 && X < ns[i].x2 && Y >= ns[i].h && Y - ns[i].h <= MAX){add_edge(0,2*i+1,Y - ns[i].h + X - ns[i].x1);add_edge(0,2*i+2,Y - ns[i].h + ns[i].x2 - X);f = 1;break;}}if(!f){if(Y <= MAX){add_edge(0,2*N+1,Y);}}dijkstra(0);cout<<d[2*N+1]<<endl;} }

總結

以上是生活随笔為你收集整理的动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。