UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。

题意:给一个由n*m个正方形格子组成的矩形,其中每个格子的边都是可以走的,长度给定,规定:如果在进入该路前需要拐弯,或者走完该路需要拐弯,都是需要付出双倍距离的(每条路最多算2倍)。问从起点到终点的最短路经长。

思路:这个题目超级难搞,思路很简单,就是很麻烦!!!我将1个点4个方向的路长都记录下来,然后进行最短路,只要一个点的某个方向更新了,就进队。所有都考虑得差不多了,就是WA。。。

  步骤 :

  (1)起点不进队,因为起点出发都需要双倍,况且,如果起点路长为0的话,其他点就不能路过起点了,所以将起点能更新到的点进队,并更新他们的路长,而起点路长仍然是INF。

  (2)对于用一个点来更新别人,可以更新相邻4个方向的点,而更新某一个方向的点又可以用当前点的4个方向来更新它。

  (3)一旦被更新的点是终点,就更新答案(出来也要双倍)。因为路径可能经过终点多次再折返从终点出来会更近。

  (4)所以边注意不能算2倍以上。

  

  1 #include <bits/stdc++.h>
  2 #define INF 0x7f7f7f7f
  3 #define pii pair<int,int>
  4 #define LL unsigned long long
  5 #define up 0
  6 #define right 1
  7 #define down 2
  8 #define left 3
  9 using namespace std;
 10 const int N=110;
 11 int n, m, a, sx, sy, ex, ey;
 12 int g[N][N][4];     //0从12点钟开始,顺时针走
 13 int dist[N][N][4];  //记录来自4个方向的距离
 14 int tag[N][N][4];  //标记4个值是否已经翻倍了
 15 int inq[N][N];
 16 int ans;
 17 bool ok(int x, int y)
 18 {
 19     if(x>0&&x<=n && y>0&&y<=m)    return true;
 20     else    return false;
 21 }
 22 void isinq(deque<pii> &que, int x,int y)
 23 {
 24     if(!inq[x][y])    que.push_back(make_pair(x,y));
 25     inq[x][y]=1;
 26 }
 27
 28 void isend(int x,int y)
 29 {
 30     if(x==ex && y==ey)
 31     {
 32         if(dist[x][y][up]<INF)
 33             ans=min(ans, dist[x][y][up]+(1-tag[x][y][up])*g[x][y][down]);
 34         if(dist[x][y][down]<INF)
 35             ans=min(ans, dist[x][y][down]+(1-tag[x][y][down])*g[x][y][up]);
 36         if(dist[x][y][left]<INF)
 37             ans=min(ans, dist[x][y][left]+(1-tag[x][y][left])*g[x][y][right]);
 38         if(dist[x][y][right]<INF)
 39             ans=min(ans, dist[x][y][right]+(1-tag[x][y][right])*g[x][y][left]);
 40     }
 41 }
 42
 43
 44 void init_start(deque<pii> &que)
 45 {
 46     int x=sx;
 47     int y=sy;
 48     if(ok(x-1,y) && g[x][y][up] )  //上0
 49     {
 50         dist[x-1][y][up] = 2*g[x][y][up] ;
 51         tag[x-1][y][up]=1;           //拐弯了,已经翻倍
 52         isinq(que, x-1, y );
 53         isend(x-1,y);
 54     }
 55     if(ok(x+1,y) && g[x][y][down] )  //下2
 56     {
 57         dist[x+1][y][down] = 2*g[x][y][down];
 58         tag[x+1][y][down]=1;
 59         isinq(que, x+1, y );
 60         isend(x+1,y);
 61     }
 62     if(ok(x,y-1) && g[x][y][left] )  //左3
 63     {
 64         dist[x][y-1][left] = 2*g[x][y][left];
 65         tag[x][y-1][left]=1;
 66         isinq(que, x, y-1);
 67         isend(x,y-1);
 68     }
 69     if(ok(x,y+1) && g[x][y][right] )  //右1
 70     {
 71         dist[x][y+1][right] = 2*g[x][y][right];
 72         tag[x][y+1][right]=1;
 73         isinq(que, x, y+1);
 74         isend(x,y+1);
 75     }
 76
 77 }
 78
 79
 80 void spfa()
 81 {
 82     deque<pii> que;
 83     init_start(que);
 84
 85
 86     while(!que.empty())
 87     {
 88         int x=que.front().first;
 89         int y=que.front().second;
 90         que.pop_front();
 91         inq[x][y]=0;
 92         //每个点有4个方向
 93         if(ok(x-1,y) && g[x][y][up] )  //上0
 94         {
 95             if(dist[x][y][up]<INF && dist[x-1][y][up]> dist[x][y][up] + g[x][y][up])  //上->上
 96             {
 97                 dist[x-1][y][up]= dist[x][y][up] + g[x][y][up];
 98                 tag[x-1][y][up]=0;   //直走的,不计
 99                 isinq(que, x-1, y );
100             }
101             if(dist[x][y][right]<INF && dist[x-1][y][up]> dist[x][y][right] + (1-tag[x][y][right])*g[x][y][left] + 2*g[x][y][up]  )  //右->上
102             {
103                 dist[x-1][y][up]= dist[x][y][right] + (1-tag[x][y][right])*g[x][y][left] + 2*g[x][y][up];
104                 tag[x-1][y][up]=1;  //拐弯了,已经翻倍
105                 isinq(que, x-1, y );
106             }
107             if(dist[x][y][left]<INF && dist[x-1][y][up]> dist[x][y][left] + (1-tag[x][y][left])*g[x][y][right] + 2*g[x][y][up]  )  //左->上
108             {
109                 dist[x-1][y][up]= dist[x][y][left] + (1-tag[x][y][left])*g[x][y][right] + 2*g[x][y][up];
110                 tag[x-1][y][up]=1;  //同上
111                 isinq(que, x-1, y );
112             }
113             if(dist[x][y][down]<INF && dist[x-1][y][up]> dist[x][y][down] + (1-tag[x][y][down])*g[x][y][up] + 2*g[x][y][up]  )    //下-上
114             {
115                 dist[x-1][y][up]= dist[x][y][down] + (1-tag[x][y][down])*g[x][y][up] + 2*g[x][y][up];
116                 tag[x-1][y][up]=1;
117                 isinq(que, x-1, y);
118             }
119             isend(x-1,y);
120         }
121         if(ok(x+1,y) && g[x][y][down] )  //下2
122         {
123             if(dist[x][y][down]<INF && dist[x+1][y][down] > dist[x][y][down] + g[x][y][down] )  //下->下
124             {
125                 dist[x+1][y][down] = dist[x][y][down] + g[x][y][down];
126                 tag[x+1][y][down]=0;
127                 isinq(que, x+1, y );
128             }
129             if(dist[x][y][right]<INF && dist[x+1][y][down] > dist[x][y][right] + (1-tag[x][y][right])*g[x][y][left] + 2*g[x][y][down] )  //右->下
130             {
131                 dist[x+1][y][down] = dist[x][y][right] + (1-tag[x][y][right])*g[x][y][left] + 2*g[x][y][down];
132                 tag[x+1][y][down]=1;
133                 isinq(que, x+1, y );
134             }
135             if(dist[x][y][left]<INF && dist[x+1][y][down] > dist[x][y][left] + (1-tag[x][y][left])*g[x][y][right] + 2*g[x][y][down] )  //左->下
136             {
137                 dist[x+1][y][down] = dist[x][y][left] + (1-tag[x][y][left])*g[x][y][right] + 2*g[x][y][down];
138                 tag[x+1][y][down]=1;
139                 isinq(que, x+1, y);
140             }
141             if(dist[x][y][up]<INF && dist[x+1][y][down] > dist[x][y][up] + (1-tag[x][y][up])*g[x][y][down] + 2*g[x][y][down]  )   //上-下
142             {
143                 dist[x+1][y][down] = dist[x][y][up] + (1-tag[x][y][up])*g[x][y][down] + 2*g[x][y][down];
144                 tag[x+1][y][down]=1;
145                 isinq(que, x+1, y);
146             }
147             isend(x+1,y);
148         }
149         if(ok(x,y-1) && g[x][y][left] )  //左3
150         {
151             if(dist[x][y][left]<INF && dist[x][y-1][left] > dist[x][y][left] + g[x][y][left]  )  //左->左
152             {
153                 dist[x][y-1][left] = dist[x][y][left] + g[x][y][left];
154                 tag[x][y-1][left]=0;
155                 isinq(que, x, y-1);
156             }
157             if(dist[x][y][down]<INF && dist[x][y-1][left] > dist[x][y][down] + (1-tag[x][y][down])*g[x][y][up] + 2*g[x][y][left] )  //下->左
158             {
159                 dist[x][y-1][left] = dist[x][y][down] + (1-tag[x][y][down])*g[x][y][up] + 2*g[x][y][left];
160                 tag[x][y-1][left]=1;
161                 isinq(que, x, y-1);
162             }
163             if(dist[x][y][up]<INF && dist[x][y-1][left] > dist[x][y][up] + (1-tag[x][y][up])*g[x][y][down] + 2*g[x][y][left] )  //上->左
164             {
165                 dist[x][y-1][left] = dist[x][y][up] + (1-tag[x][y][up])*g[x][y][down] + 2*g[x][y][left];
166                 tag[x][y-1][left]=1;
167                 isinq(que, x, y-1);
168             }
169             if(dist[x][y][right]<INF && dist[x][y-1][left] > dist[x][y][right] + (1-tag[x][y][right])*g[x][y][left] + 2*g[x][y][left]   )   //右-左
170             {
171                 dist[x][y-1][left] = dist[x][y][right] + (1-tag[x][y][right])*g[x][y][left] + 2*g[x][y][left];
172                 tag[x][y-1][left]=1;
173                 isinq(que, x, y-1);
174             }
175             isend(x,y-1);
176         }
177         if(ok(x,y+1) && g[x][y][right] )  //右1
178         {
179             if(dist[x][y][right]<INF && dist[x][y+1][right] > dist[x][y][right] + g[x][y][right]  )  //右->右
180             {
181                 dist[x][y+1][right] = dist[x][y][right] + g[x][y][right];
182                 tag[x][y+1][right]=0;
183                 isinq(que, x, y+1);
184             }
185             if(dist[x][y][down]<INF && dist[x][y+1][right] > dist[x][y][down] + (1-tag[x][y][down])*g[x][y][up] + 2*g[x][y][right] )  //下->右
186             {
187                 dist[x][y+1][right] = dist[x][y][down] + (1-tag[x][y][down])*g[x][y][up] + 2*g[x][y][right];
188                 tag[x][y+1][right]=1;
189                 isinq(que, x, y+1);
190             }
191             if(dist[x][y][up]<INF && dist[x][y+1][right] > dist[x][y][up] + (1-tag[x][y][up])*g[x][y][down] + 2*g[x][y][right] )  //上->右
192             {
193                 dist[x][y+1][right] = dist[x][y][up] + (1-tag[x][y][up])*g[x][y][down] + 2*g[x][y][right];
194                 tag[x][y+1][right]=1;
195                 isinq(que, x, y+1);
196             }
197
198             if(dist[x][y][left]<INF && dist[x][y+1][right] > dist[x][y][left] + (1-tag[x][y][left])*g[x][y][right] + 2*g[x][y][right] ) //左-右
199             {
200                 dist[x][y+1][right] = dist[x][y][left] + (1-tag[x][y][left])*g[x][y][right] + 2*g[x][y][right];
201                 tag[x][y+1][right]=1;
202                 isinq(que, x, y+1);
203             }
204             isend(x,y+1);
205         }
206     }
207 }
208
209
210 int cal()
211 {
212     memset(dist, 0x7f, sizeof(dist));
213     memset(tag, 0, sizeof(tag));
214     memset(inq, 0, sizeof(inq));
215     ans=INF;
216     spfa();
217     return ans==INF? 0: ans;
218 }
219
220
221 int main()
222 {
223     //freopen("input.txt", "r", stdin);
224     int Case=0;
225     while(scanf("%d %d %d %d %d %d", &n, &m, &sx, &sy, &ex, &ey), n+m+sx+sy+ex+ey)
226     {
227         memset(g, 0, sizeof(g));
228         for(int x=1; x<n; x++)  //行号
229         {
230             for(int y=1; y<m; y++)  //列号
231             {
232                 scanf("%d", &a);
233                 g[x][y][right]=a;   //右边1
234                 g[x][y+1][left]=a; //左边3
235             }
236             for(int y=1; y<=m; y++)
237             {
238                 scanf("%d", &a);
239                 g[x][y][down]=a;   //下2
240                 g[x+1][y][up]=a; //上0
241             }
242         }
243         for(int y=1; y<m; y++)
244         {
245             scanf("%d", &a);
246             g[n][y][right]=a;   //右
247             g[n][y+1][left]=a; //左
248         }
249
250         int aa=cal();
251         if(aa) printf("Case %d: %d\n",++Case, aa);
252         else    printf("Case %d: Impossible\n", ++Case);
253     }
254     return 0;
255 }

WA代码

时间: 2024-12-25 13:05:17

UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。的相关文章

UVaLive 4128 Steam Roller (多决策最短路)

题意:给定一个图,r 根横线, c 根竖线.告诉你起点和终点,然后从起点走,每条边有权值,如果是0,就表示无法通行.走的规则是:如果你在下个路要转弯,会使这段路的时间加倍,但是如果一条路同时是这样,那么也只算两倍.起点和终点他们相连的第一条边也算两倍.问你最短时间. 析:把每个点拆成 8 个点(r, c, dir, doubled)分别下一步走哪个方向,是不是要加倍,然后每次枚举上一条,和新边,枚举上一边是不是加倍之后的,然后判断是不是要转弯,然后计算加不加倍,最后跑一次最短路,就好了. 代码如

UVA 1078 - Steam Roller(最短路)

UVA 1078 - Steam Roller 题目链接 题意:给定一个地图,要求起点走到终点需要的时间,如果进入一个转弯位置,则进入和出去的时候时间要加倍 思路:最短路,关键在于如何建模,每个结点d[x][y][d][flag]表示在x, y结点,方向为d,是否加倍过了,这样就可以把每个结点之间对应的关系建边,做最短路即可 代码: #include <cstdio> #include <cstring> #include <vector> #include <q

URAL 1934 Black Spot --- 简单最短路变形

边权为1,在维护最短路的同时维护p值最小,我直接存的(1-p),即不遇见的概率,要使得这个值最大. #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #includ

UESTC 915 方老师的分身II --最短路变形

即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了.求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #incl

zoj 1655 Transport Goods (最短路变形)

Transport Goods Time Limit: 2 Seconds      Memory Limit: 65536 KB The HERO country is attacked by other country. The intruder is attacking the capital so other cities must send supports to the capital. There are some roads between the cities and the

zoj1655 最短路变形

题意:HERO过的首都需要货物,需要从其他的城市吧货物送到首都,每条道路都会需要消耗一定比例的货物,问最多能送多少货物到首都. 思路:如果每个点的比例是1,到达首都的比例就是经过的路径的(1-消耗比)的乘积,反正是无向的,所以可以反过来推,首都的货物比是1,而到达每座 城市的货物就是所经过的路径(1-消耗比)的乘积,则由此可见,我们可以求首都到任意城市的最大比值:最后把每个点的最大比值乘以每个点的货物加起来 即是结果. #include<stdio.h> #include<string.

HN0I2000最优乘车 (最短路变形)

HN0I2000最优乘车 (最短路变形) [试题]为了简化城市公共汽车收费系统,某城市决定对大部分的公共汽车都采用一票制,但由于某些公共汽车所经过的停车站太多和路途太长,就采用两票或多票制.经过这种票制改革后,人们坐公共汽车从一个站到另一个站时,就不得不选择一个好的乘车方案,以使他们的乘车费用最低. 为了方便于求出最佳的乘车方案,我们假设: l  采用一票制的公共汽车,无论从哪个站上车到那个站下车,乘该公共汽车的费用为1(费用单位). l  采用多票制的公共汽车,将设立某些站为关键站:那么,如果

POJ 1797 Heavy Transportation (最短路变形)

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20364   Accepted: 5401 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man

HDOJ find the safest road 1596【最短路变形】

find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9033    Accepted Submission(s): 3173 Problem Description XX星球有非常多城市,每一个城市之间有一条或多条飞行通道,可是并非全部的路都是非常安全的,每一条路有一个安全系数s,s是在 0 和