题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小

紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离,

第二次bfs从起点沿着每到达一个节点d[]减少1来走,按照颜色的字典序最小的路径来走

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include <cmath>
  5. #include<stack>
  6. #include<vector>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<algorithm>
  11. using namespace std;
  12.  
  13. typedef long long LL;
  14. const int INF = ;
  15. const int mod=;
  16. const int maxn=;
  17.  
  18. struct Edge{
  19. int u,v,c;
  20. Edge(int u=,int v=,int c=):u(u),v(v),c(c){}
  21. };
  22.  
  23. vector<Edge> edges;
  24. vector<int> G[maxn];
  25.  
  26. void addedges(int u,int v,int c){
  27. edges.push_back(Edge(u,v,c));
  28. int idx=edges.size()-;
  29. G[u].push_back(idx);
  30. }
  31.  
  32. int n,vis[maxn],d[maxn];
  33.  
  34. void rev_bfs(){//求出每一个节点到终点n-1的距离
  35. memset(vis,,sizeof(vis));
  36. vis[n-]=true;
  37. d[n-]=;
  38.  
  39. queue<int> q;
  40. q.push(n-);
  41. while(!q.empty()){
  42. int v=q.front();q.pop();
  43. for(int i=;i<G[v].size();i++){
  44. int e=G[v][i];
  45. int u=edges[e].v;
  46. if(!vis[u]){
  47. vis[u]=true;
  48. d[u]=d[v]+;
  49. q.push(u);
  50. }
  51. }
  52. }
  53. }
  54.  
  55. vector<int> ans;
  56.  
  57. void bfs(){
  58. memset(vis,,sizeof(vis));
  59. vis[]=true;
  60. ans.clear();
  61.  
  62. vector<int> next;
  63. next.push_back();
  64.  
  65. for(int i=;i<d[];i++){
  66. int min_color=INF;
  67. for(int j=;j<next.size();j++){
  68. int u=next[j];
  69. for(int k=;k<G[u].size();k++){
  70. int e=G[u][k];
  71. int v=edges[e].v;
  72. if(d[u]==d[v]+)
  73. min_color=min(min_color,edges[e].c);
  74. }
  75. }
  76.  
  77. ans.push_back(min_color);
  78.  
  79. vector<int> next2;
  80. for(int j=;j<next.size();j++){
  81. int u=next[j];
  82. for(int k=;k<G[u].size();k++){
  83. int e=G[u][k];
  84. int v=edges[e].v;
  85. if(d[u]==d[v]+&&edges[e].c==min_color&&!vis[v]) {
  86. vis[v]=true;
  87. next2.push_back(v);
  88. }
  89. }
  90. }
  91. next=next2;
  92. }
  93.  
  94. printf("%d\n",ans.size());
  95. printf("%d",ans[]);
  96. for(int i=;i<ans.size();i++) printf(" %d",ans[i]);
  97. printf("\n");
  98. }
  99.  
  100. int main(){
  101. int m,u,v,c;
  102. while(scanf("%d %d",&n,&m)==){
  103. edges.clear();
  104. for(int i=;i<n;i++) G[i].clear();
  105.  
  106. while(m--){
  107. scanf("%d %d %d",&u,&v,&c);
  108. addedges(u-,v-,c);
  109. addedges(v-,u-,c);
  110. }
  111. rev_bfs();
  112. bfs();
  113. }
  114. return ;
  115. }

这道题放了一个月,最后还是看的标程,艾---看来有些题目不是拖得越久就会了,,,,

不要懒的说啊----

加油--gooooooooooooo---

UVa 1599 Ideal Path【BFS】的更多相关文章

  1. Uva 1599 Ideal Path - 双向BFS

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

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

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

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

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

  4. UVa 1599 Ideal Path (两次BFS)

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

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

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

  6. UVA 1599 Ideal Path (HDU 3760)

    两次bfs: 第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路:第二次bfs根据最短距离可以选择满足条件的最短路. 注意!碰到这种很大数据量的题目一定要记得用scanf,printf 输入 ...

  7. poj 3126 Prime Path 【bfs】

    题目地址:http://poj.org/problem?id=3126 Input One line with a positive number: the number of test cases ...

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

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

  9. UVA 1599 Ideal Path

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

随机推荐

  1. gpg 的使用

    GPG入门教程 GpG使用指南 1. 安装 源码编译安装:源码下载地址 ./configure make make install 直接安装编译好的二进制文件 # Debian / Ubuntu 环境 ...

  2. localStorage、sessionStorage的区别

    1.localStorage生命周期是永久的, sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了. ...

  3. 忽略PyCharm4中特定的警告提示信息

    有一种简单的方式忽略PyCharm4中的警告,光标放在下划线上,a. 等灯泡出现,点击灯泡或者b. 按下Alt和Enter键,选择'Ignore errors like this'. 或者,在设置里更 ...

  4. swift语言点评十七-Designated Initializers and Convenience Initializers

    Swift defines two kinds of initializers for class types to help ensure all stored properties receive ...

  5. HDU-5009 Paint Pearls 动态规划 双向链表

    题目链接:https://cn.vjudge.net/problem/HDU-5009 题意 给一串序列,可以任意分割多次序列,每次分割的代价是被分割区间中的数字种数. 求分割区间的最小代价.n< ...

  6. 'Upgrade' header is missing

    spring-websocket 握手失败是因为 有拦截器  注释掉拦截器就OK

  7. 【Computer Vision】角点检测和匹配——Harris算子

    一.基本概念 角点corner:可以将角点看做两个边缘的交叉处,在两个方向上都有较大的变化.具体可由下图中分辨出来: 兴趣点interest point:兴趣点是图像中能够较鲁棒的检测出来的点,它不仅 ...

  8. 找tensorboard

    一开始因为用户不对,提示tensorboard:未找到命令 切换正确账户寻找tensorboard 然后打开Xstart,输入firefox,把链接输入进去 即可

  9. LAMP环境搭建备忘 -- MariaDB 安装(三)

    因为 MySQL 的一些原因,在 Linux 平台上的开源数据库渐渐被 MariaDB 取代. MariaDB 安装命令如下图 安装成功后,接下来就启动这个数据库服务 我们还需要对数据库做一些初始化的 ...

  10. 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)

    思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...