给定起点终点的无向图,出发时速度为1,到达时速度也为1,在每个点可以进行速度+1,不变,-1的操作,在每条边都有限速,到达一城市后不能直接走反向边,求最短时间。

SPFA作松弛操作的典型例子,设计状态f[i][j][k]为从k城市以j速度到达城市i时的最短时间,然后开一队列依次向下一个城市做递推即可,最后看任意城市以速度1到终点城市的时间最小值即可。递推初值可设置为f[s][0][0],然后做速度必须>0的限制即可保证以速度1出发。

表示依然不太清楚struct或者class能不能直接用=赋值,重载operator =不会写,保险起见,本程序中写了assign()函数进行赋值。

// Problem#: 7692
// Submission#: 1966931
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct data{int city,vel,back;
}s[1000000];
struct data1{int city,d,c,next;
}a[1000];
double f[40][110][40];
int inqueue[40][110][40];
int first[40];
int tot;
void assign(struct data &a,struct data b)
{a.city=b.city;a.vel=b.vel;a.back=b.back;
}
void init()
{int i,j,k;tot=0;for (i=0;i<=30;i++)for (j=0;j<=110;j++)for (k=0;k<=30;k++)f[i][j][k]=10000;memset(first,0,sizeof(first));memset(a,0,sizeof(a));memset(inqueue,0,sizeof(inqueue));
}
void addedge(int x,int y,int d,int c)
{tot++;a[tot].city=y;a[tot].d=d;a[tot].c=c;a[tot].next=first[x];first[x]=tot;tot++;a[tot].city=x;a[tot].d=d;a[tot].c=c;a[tot].next=first[y];first[y]=tot;
}
void spfa(int s1,int g)
{struct data now,next;f[s1][0][0]=0;inqueue[s1][0][0]=1;now.city=s1;now.vel=0;now.back=0;int head=0,tail=0;assign(s[0],now);inqueue[s1][0][0]=1;while (head<=tail){assign(now,s[head]);for (int i=first[now.city];i;i=a[i].next){if (a[i].city!=now.back)for (int j=-1;j<=1;j++)if (now.vel+j>0 && now.vel+j<=a[i].c && f[a[i].city][now.vel+j][now.city]>f[now.city][now.vel][now.back]+(double)a[i].d/(now.vel+j)){f[a[i].city][now.vel+j][now.city]=f[now.city][now.vel][now.back]+(double)a[i].d/(now.vel+j);if (!inqueue[a[i].city][now.vel+j][now.city]){inqueue[a[i].city][now.vel+j][now.city]=1;next.city=a[i].city;next.vel=now.vel+j;next.back=now.city;tail++;assign(s[tail],next);}}}inqueue[now.city][now.vel][now.back]=0;head++;}
}
int main()
{int n,m,s,g,i,j,x,y,d,c;while (scanf("%d %d",&n,&m),n|m){init();scanf("%d %d",&s,&g);for (i=1;i<=m;i++){scanf("%d %d %d %d",&x,&y,&d,&c);addedge(x,y,d,c);}spfa(s,g);double maxtime=10000;for (j=0;j<=30;j++)if (f[g][1][j]<maxtime)maxtime=f[g][1][j];if (s==g){printf("0.00000\n");continue;}if (maxtime==10000)printf("unreachable\n");elseprintf("%.5lf\n",maxtime);}return 0;
}

转载于:https://www.cnblogs.com/USTC-ACM/archive/2013/03/18/2966463.html

SYSU每周一赛(13.03.16)1003相关推荐

  1. 阿里云IoT赵磊:ICA联盟,构建未来物联网生态圈 | 金山软件第三季度营收13.03亿元

    每一个企业级的人 都置顶了 中国软件网 中国软件网 为你带来最新鲜的行业干货   小编点评 企服三会的第二天结束啦 伙伴们都有什么收获呢? 希望明天能给大家更多的惊喜 HR 服务峰会 你一定不要错过呀 ...

  2. Linux一句话精彩问答--2004/03/16更新(zt)

    Linux一句话精彩问答--2004/03/16更新 ----------------------------网络无关篇-------------------------- 0001 修改主机名(bj ...

  3. python生成时间戳_python生成13位或16位时间戳以及反向解析时间戳的实例

    我就废话不多说了,直接上代码吧! import datetime import time def get_float_time_stamp(): datetime_now = datetime.dat ...

  4. Firefox火狐浏览器自用技巧汇总--以备使用--13.5.16

    现在开始使用火狐浏览器了,对于火狐,有好多的设置,自己记不住,还是记下来吧. 更新日期:13.5.16 1.取消标签页置顶(下置):请在地址栏输入about:config,搜索top,找到browse ...

  5. python日期格式转换成13位时间戳_python生成13位或16位时间戳以及反向解析时间戳的实例...

    我就废话不多说了,直接上代码吧! import datetime import time def get_float_time_stamp(): datetime_now = datetime.dat ...

  6. viper4android使用时,ViPER4Android 目前进度 [11-21,13时16分]

    [ViPER4Android 目前进度] 为了让广大支持我的机油时刻了解目前ViPER4Android新版本的进度,特开此贴将进度实时更新以缓解大家焦急等待的心情. FX进度:[编码ing],版本:v ...

  7. c语言验证信用卡 卡号介于13到16位,使用luhn算法验证信用卡号码

    信用卡号码符合特定模式.信用卡必须有13到16位数字.它必须先从: •4 Visa卡 •5主卡 •37美国运通卡 在1954年,IBM的汉斯·卢恩提出的算法验证信用卡号.该算法对于确定卡号是否正确输入 ...

  8. FPGA开发工具套餐搭配推荐及软件链接 (更新于2020.03.16)

    一.Xilinx(全球FPGA市场份额最大的公司,其发展动态往往也代表着整个FPGA行业的动态) (1) Xilinx官方软件下载地址链接: https://china.xilinx.com/supp ...

  9. 集训队每周一赛2020-03-06(思维+暴力)

    第二次周赛 A 我是A题 CodeForces 1305 题解 B 我是B题 计蒜客 A1530 题解 C 我是C题 HDU 2673 题解 D 我是D题 CodeForces 304B 题解 E 我 ...

最新文章

  1. 超级计算机在线解方程,量子计算机10秒可得超级计算机百年运算结果
  2. 【转】完美解决Asp.Net的MasterPage中添加JavaScript路径问题
  3. 几种常见光端机的作用介绍
  4. 洛谷 P1372 又是毕业季I
  5. iOS 8 UI布局 AutoLayout及SizeClass(二)
  6. python3安装后怎么开启_python3.10 如何下载安装?
  7. pthread异步_异步管道的实现
  8. 深大计算机系有金工实习吗,金工实习报告答案深圳大学拿A答案(精选).pdf
  9. 大数据究竟是什么?一句话让你认识并读懂大数据
  10. 凯辉基金与法投行完成对资管软件公司NeoXam的投资 加速企业国际化发展布局
  11. unity 游戏版本更新插件
  12. mathtype安装教程
  13. 关于VGA接口连接1080p显示器模糊多半是线的问题
  14. scratch3.0探索000
  15. 函数的单调性与极值点
  16. 2019年江苏卷数学高考真题Word版含答案解析
  17. What‘s next for AlphaFold and the AI protein-folding revolution / 什么是AlphaFold和AI蛋白质折叠革命的下一步?
  18. python 爬虫+写入excel 小案例
  19. 2019 | 开启新的堕落生活
  20. Clickhouse时间日期函数一文详解+代码展示

热门文章

  1. Rust核心团队前成员Brian Anderson加入PingCAP
  2. 人民币数字金额转大写金额
  3. 对互联网中常见地图的坐标系探讨
  4. lightswitch 添加 TreeView 控件
  5. javascript校验2
  6. C#——image与byte数组的转换
  7. 我为什么“放弃”从事八年的嵌入式领域
  8. Diango博客--21.实现简单的全文搜索
  9. oracle 加全文索引,Oracle创建全文索引
  10. python 打包exe_python如何封装为exe