ural 1930 Ivan's Car(spfa)
2017-06-16 09:10
507 查看
题意:
n个点,m条边,从s到t,给出一条边,x,y,说明x在低的位置,x到y汽车的模式上向上,从y到x汽车的模式向下,汽车从s可是的模式可以随便调,不计入,问最后到达t最少需要多少次转换模式。
解题思路
最短路还是挺明显的,就是,我一开始把向上的边赋值为0,向下的赋值为1,这样建图直接跑最短路,wa了无数发,仔细一想,这是不对的,因为连续的向下模式下是不用换模式的,而我这样做就会每次累加1,所以最短路里转移的时候应该是这样:
dp[v]=max(dp[v], dp[u]+w^dir[u]),(u->v),dir记录u的模式
为什么是异或呢,因为模式不同的情况才需要换挡,所以用异或。
然后就是一开始汽车的模式是可以任意调整的,所以应该对一开始的u特判,或者提前入队。
代码:
n个点,m条边,从s到t,给出一条边,x,y,说明x在低的位置,x到y汽车的模式上向上,从y到x汽车的模式向下,汽车从s可是的模式可以随便调,不计入,问最后到达t最少需要多少次转换模式。
解题思路
最短路还是挺明显的,就是,我一开始把向上的边赋值为0,向下的赋值为1,这样建图直接跑最短路,wa了无数发,仔细一想,这是不对的,因为连续的向下模式下是不用换模式的,而我这样做就会每次累加1,所以最短路里转移的时候应该是这样:
dp[v]=max(dp[v], dp[u]+w^dir[u]),(u->v),dir记录u的模式
为什么是异或呢,因为模式不同的情况才需要换挡,所以用异或。
然后就是一开始汽车的模式是可以任意调整的,所以应该对一开始的u特判,或者提前入队。
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=1e5+5; const int inf=1e9; struct { int to; int w; int nex; }edg[maxn*100]; int head[maxn]; int book[maxn]; int dp[maxn]; int x[maxn]; int y[maxn]; int q[maxn*100]; int dir[maxn]; int cnt; void add(int u, int v, int w) { edg[cnt].to=v; edg[cnt].w=w; edg[cnt].nex=head[u]; head[u]=cnt++; return; } void spfa(int s, int t) { int i, j, u, v, w, h, tail; h=tail=0; q[tail++]=s; dp[s]=0; dir[s]=0; book[s]=1; u=s; for(int i=head[s]; i!=-1; i=edg[i].nex) { v=edg[i].to; w=edg[i].w; dp[v]=dp[u]; dir[v]=w; book[v]=1; q[tail++]=v; } book[u]=0; h++; while(h<tail) { int u=q[h]; // printf("%d\n", u); for(int i=head[u]; i!=-1; i=edg[i].nex) { v=edg[i].to; w=edg[i].w; if(dp[v]>(dp[u]+(w^dir[u]))) { dp[v]=dp[u]+(w^dir[u]); dir[v]=w; if(!book[v]) { q[tail++]=v; book[v]=1; } } } book[u]=0; h++; } return; } int main() { int n, m, i, j; while(~scanf("%d%d", &n, &m)) { cnt=0; for(i=0; i<=n; i++) { dp[i]=inf; book[i]=0; head[i]=-1; } for(i=0; i<m; i++) { scanf("%d%d", &x[i], &y[i]); } int s, t; scanf("%d%d", &s, &t); for(i=0; i<m; i++) { add(x[i], y[i], 0); add(y[i], x[i], 1); } spfa(s, t); printf("%d\n", dp[t]); } return 0; } /* 5 4 1 2 3 2 4 3 5 4 1 5 */
相关文章推荐
- 【最小齿轮切换次数 spfa】URAL - 1930 Ivan's Car
- ural 1930 Ivan's Car(spfa)
- URAL 1930 Ivan's Car
- Ivan's Car URAL - 1930——前向星+spfa算法
- URAL 1930 Ivan's Car(BFS)
- spfa最短路 [URAL-1930]
- ural 1002. Phone Numbers tire+spfa
- URAL - 1930
- URAL 1031. Railway Tickets(spfa)
- URAL 1016 Cube on the Walk (SPFA+HASH)
- ural 1930. Ivan's Car
- URAL 1205 By the Underground or by Foot?(SPFA)
- 1930. Ivan's Car(spfa)
- Ural 1450 求最长路 SPFA
- URAL 1980 Road to Investor (二分 + SPFA)
- URAL 1254 Die Hard (SPFA)
- Ural1254(SPFA)
- URAL 题目1553. Caves and Tunnels(Link Cut Tree 修改点权,求两点之间最大)
- 麻烦感[By Ivan]
- 【SPFA】