两次bfs;

第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路;第二次bfs根据最短距离可以选择满足条件的最短路。

注意!碰到这种很大数据量的题目一定要记得用scanf,printf 输入输出!!!

ps:uva和hdu中数据输入有些出入。。。(uva中没有输入T。。。)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int maxn=+;
  9. const int inf=;
  10.  
  11. struct node {
  12. int u,v,w;
  13. int next;
  14. void init (int nu,int nv,int nw,int nnext){
  15. u=nu;v=nv;w=nw;next=nnext;
  16. }
  17. }edges[maxn*];
  18.  
  19. int n,m,cnt;
  20. int head[maxn],d[maxn],visit[maxn];
  21.  
  22. void addedges (int u,int v,int w){
  23. edges[cnt].init (u,v,w,head[u]);
  24. head[u]=cnt++;
  25. }
  26.  
  27. void anti_bfs (){
  28. queue<int> q;
  29. while (!q.empty ())
  30. q.pop ();
  31. q.push (n);
  32. d[n]=;
  33. while (!q.empty ()){
  34. int u=q.front ();
  35. q.pop ();
  36. for (int i=head[u];i!=-;i=edges[i].next){
  37. int v=edges[i].v;
  38. if (d[v]==-){
  39. d[v]=d[u]+;
  40. q.push (v);
  41. }
  42. }
  43. }
  44. printf ("%d\n",d[]);//cout<<"error";
  45. }
  46.  
  47. void bfs (){
  48. int p[maxn*];
  49. int l,r;
  50. l=r=;
  51. p[r++]=;
  52. visit[]=;
  53. while (l<r){
  54. int mi=inf;
  55. for (int j=l;j<r;j++){
  56. int u=p[j];
  57. for (int i=head[u];i!=-;i=edges[i].next){
  58. int v=edges[i].v;
  59. //if (visit[v]) continue ;
  60. if (d[u]==d[v]+)
  61. mi=min (mi,edges[i].w);//cout<<edges[i].w<<"err"<<mi<<endl;
  62. }
  63. }
  64. printf ("%d",mi);
  65. int num=r;
  66. for (int j=l;j<r;j++){
  67. int u=p[j];
  68. for (int i=head[u];i!=-;i=edges[i].next){
  69. int v=edges[i].v;
  70. if (visit[v]) continue ;
  71. if (d[u]!=d[v]+)
  72. continue ;
  73. if (mi==edges[i].w){
  74. p[num++]=v;
  75. visit[v]=;//cout<<"error";
  76. if (v==n){
  77. printf ("\n");
  78. return ;
  79. }
  80. }
  81. }
  82. }
  83. printf (" ");
  84. l=r;
  85. r=num;
  86. }
  87. }
  88.  
  89. int main (){
  90. int t;
  91. scanf ("%d",&t);
  92. while (t--){
  93. cnt=;
  94. memset (head,-,sizeof head);
  95. memset (d,-,sizeof d);
  96. memset (visit,,sizeof visit);
  97. scanf ("%d%d",&n,&m);
  98. for (int i=;i<m;i++){
  99. int a,b,c;
  100. scanf ("%d%d%d",&a,&b,&c);
  101. addedges (a,b,c);
  102. addedges (b,a,c);
  103. }
  104. anti_bfs ();
  105. bfs ();
  106. }
  107. return ;
  108. }

UVA 1599 Ideal Path (HDU 3760)的更多相关文章

  1. uva 1599 ideal path(好题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGYAAAODCAYAAAD+ZwdMAAAgAElEQVR4nOy9L8/0ypH/Pa8givGiyC

  2. UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)

    给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...

  3. UVA 1599 Ideal Path

    题意: 给出n和m,n代表有n个城市.接下来m行,分别给出a,b,c.代表a与b之间有一条颜色为c的道路.求最少走几条道路才能从1走到n.输出要走的道路数和颜色.保证颜色的字典序最小. 分析: bfs ...

  4. Uva 1599 Ideal Path - 双向BFS

    题目连接和描述以后再补 这题思路很简单但还真没少折腾,前后修改提交了七八次才AC...(也说明自己有多菜了).. 注意问题: 1.看清楚原题的输入输出要求,刚了书上的中文题目直接开撸,以为输入输出都是 ...

  5. 【每日一题】 UVA - 1599 Ideal Path 字典序最短路

    题解:给一个1e5个点2e5条边,每个边有一个值,让你输出一条从1到n边的路径使得:条数最短的前提下字典序最小. 题解:bfs一次找最短路(因为权值都是1,不用dijkstra),再bfs一次存一下路 ...

  6. UVa 1599 Ideal Path (两次BFS)

    题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径. 析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好 ...

  7. UVa 1599 Ideal Path【BFS】

    题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小 紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离, 第二 ...

  8. UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

    https://vjudge.net/problem/UVA-1599 给一个n个点m条边(2<=n<=100000,1<=m<=200000)的无向图,每条边上都涂有一种颜色 ...

  9. 【例题 6-20 UVA - 1599】Ideal Path

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 逆向做一遍bfs. 得到终点到某个点的最短距离. 这样,我们从起点顺序的时候. 就能知道最短路的下一步是要走哪里了. 这样,我们从起 ...

随机推荐

  1. 超大文件上传到Azure Linux虚拟机最佳实践

    客户在实际进行迁移的时候,往往碰到需要将本地数据中心的超大文件,比如单个200GB的文件,或者总共1TB的无数文件上传到Azure上的情况,尤其是传到Azure的Linux虚拟机的场景,这种场景包括: ...

  2. mysql在linux上重启

    如何启动/停止/重启MySQL 一.启动方式 1.使用 service 启动:service mysqld start 2.使用 mysqld 脚本启动:/etc/inint.d/mysqld sta ...

  3. 玩sdr的朋友们,在rtl_tcp时,记得调整rtl_AGC和tuner_AGC啊

    我在rtl_tcp时没有调整这个,结果怎么也听不到声音啊 还有就是在搞rtl_tcp时,一定要网速跟得上,我用无线网络时就碰到了这个问题,声音总是一直断续着,郁闷死

  4. Android APP开发需求文档范本

    Android  APP开发需求文档范本 软件需求文档格式的标准写法 1.引言 1.1 编写目的 • 阐明开发本软件的目的: 1.2 项目背景 • 标识待开发软件产品的名称.代码: • 列出本项目的任 ...

  5. 转:基础总结篇之一:Activity生命周期

    熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用.其实android中的Acti ...

  6. Robert Penner's Easing Functions

    Robert Penner's Easing Functions Robert Penner's Easing Functions A collection of swappable function ...

  7. Windows Azure功能更新:Oracle软件正式登陆Azure了

    今天,Windows Azure国际版发布了新的功能:全面支持Oracle软件,包括Oracle Linux, Oracle 12c数据库,Weblogic 11g和12c,Oracle JDK 6和 ...

  8. Scala--样例类(case)详解

    概述: case类在模式匹配和actor中经常使用到,当一个类被定义成为case类后,Scala会自动帮你创建一个伴生对象并帮你实现了一系列方法且带来了不少好处,如下: 1.实现了apply方法,意味 ...

  9. 矩阵经典题目六:poj 3070 Fibonacci

    http://poj.org/problem?id=3070 按已构造好的矩阵,那么该矩阵的n次方的右上角的数便是f[n]. #include <stdio.h> #include < ...

  10. [Python] 发送email的几种方式

    python发送email还是比較简单的,能够通过登录邮件服务来发送,linux下也能够使用调用sendmail命令来发送,还能够使用本地或者是远程的smtp服务来发送邮件,无论是单个,群发,还是抄送 ...