[noip模拟赛]旅行Pod(spfa)
来源:互联网 发布:淘宝店铺pc端装修视频 编辑:程序博客网 时间:2024/06/05 04:38
题目描述
题解
一眼看上去就是最短路嘛,只不过有一点变形而已。
将所有的边都拆成正反有向边,对于每一条边
预处理t[i][j][k]表示第i个点,从第j条路线的起点/终点(k=0/1)跑到需要跑多少时间。
然后跑spfa。每一次更新的时候,根据枚举到的边的信息,算出在该点最少还需要等多长时间能搭上通向这条路的车,其余的正常做就行。
跑spfa的时候就是计算时间的时候比较容易出错。假设起点到当前点花的时间为pt1,某一趟列车从它的起点到这个点需要跑pt2的时间,列车的周期为T的话,那么需要等的时间为
还需要注意的一点是,当pt1=pt2时,等待的时间应该为0,但是用上面的式子计算出来应该是T,也就是恰好多了一个周期。这种情况需要特判一下。
代码
#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;#define N 1005#define E 10005int n,k,x,y,gx,mx,s;struct ANS{int g,m;}ans;int C[N*2],st[N*2],p[N],r[N],t[N][N*2][2],dis[N];int tot,point[N],nxt[E*2],v[E*2],c[E*2],K[E*2],ty[E*2];bool vis[N];queue <int> q;inline void addedge(int x,int y,int z,int k,int i){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=z; K[tot]=k; ty[tot]=i;}inline void spfa(){ memset(dis,127/3,sizeof(dis)); dis[x]=mx; memset(vis,0,sizeof(vis)); vis[x]=true; while (!q.empty()) q.pop(); q.push(x); while (!q.empty()) { int now=q.front(); q.pop(); vis[now]=false; for (int i=point[now];i;i=nxt[i]) { int pt1=dis[now]; int pt2=t[now][K[i]][ty[i]]; int T=C[K[i]]; int waiting,waito; waiting=T-(((pt1-pt2)%60+60)%60)%T; if (waiting==T) waiting=0; waito=pt1+waiting; if (waito+c[i]<dis[v[i]]) { dis[v[i]]=waito+c[i]; if (!vis[v[i]]) { vis[v[i]]=true; q.push(v[i]); } } } }}inline ANS calc(int g,int m,int len){ ANS ans; m+=len; g+=m/60; m%=60; g%=24; return ans=(ANS){g,m};}int main(){ freopen("pod.in","r",stdin); freopen("pod.out","w",stdout); scanf("%d%d%d%d%d%d",&n,&k,&x,&y,&gx,&mx); for (int i=1;i<=k;++i) { scanf("%d%d",&s,&C[i]); for (int j=1;j<=s;++j) scanf("%d",&p[j]); for (int j=1;j<s;++j) scanf("%d",&r[j]); for (int j=1;j<s;++j) { addedge(p[j],p[j+1],r[j],i,0); addedge(p[j+1],p[j],r[j],i,1); } for (int j=2;j<=s;++j) t[p[j]][i][0]=t[p[j-1]][i][0]+r[j-1]; for (int j=s-1;j>=1;--j) t[p[j]][i][1]=t[p[j+1]][i][1]+r[j]; } spfa(); ans=calc(gx,mx,dis[y]-mx); printf("%d %d\n",ans.g,ans.m);}
总结
1、这道题计算时间的细节非常值得推敲,以后细节要格外注意,想得更清楚一些。
0 0
- [noip模拟赛]旅行Pod(spfa)
- [noip模拟赛]邮递员送信(spfa)
- noip模拟赛 bzoj2932旅行
- [NOIP 模拟]P老师的旅行 Spfa+树状数组
- #bzoj2934#【重庆市NOIP模拟赛】业务(SPFA / Dijk)
- 【贪心】【枚举】【重庆市NOIP模拟赛】旅行
- 【NOIP 模拟题】旅行(最短路)
- [NOIP模拟题]最佳旅行
- #bzoj2932#【重庆市NOIP模拟赛】旅行(贪心 DP是不可以的!)
- 1452: 旅行(SPFA)
- [NOIP 模拟]疫情延迟 二分+Spfa
- NOIP模拟题 [SPFA][DP][栈结构]
- 11-1 noip模拟 第二题 SPFA+状压dp
- 20160930的考试,noip模拟】SPFA,LIS,状压dp
- NOIP模拟题 2016.10.4 [Hash] [dp] [复杂状态spfa]
- [NOIP模拟题][费马小定理][搜索][建图][SPFA]
- nyoj247 虚拟城市的旅行(spfa)
- HDU 2066 一个人的旅行(Spfa)
- java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoa
- Lightoj 1138 ( Trailing Zeroes (III))
- JavaEE完整技术体系文章陆续上映!!!
- Qt 延时
- 求乘方取模(快速幂+慢速乘法模板)
- [noip模拟赛]旅行Pod(spfa)
- 图的深度遍历
- Android 之 EditText ImageView ImageButton控件
- 顺序表应用1:多余元素删除之移位算法
- logback.xml常用配置详解<configuration> and <logger>
- 146. LRU Cache
- Spring 事物机制总结
- Redis 管道出现线程穿插
- React Native几个重要的属性