题目链接:https://uva.onlinejudge.org/external/15/1599.pdf

题意: 保证在最短路的时候,输出字典序最小的路径。

方法:

路径上有了权值,可以利用图论的数据结构来BFS,很方便。

逆序BFS,找到每个点距离终点的最短路长 d[x] ;

然后,从起点,沿着 d[u] = d[v] + 1; 的路径,分层BFS,选字典序最小的。找到那个最小字典序的节点之后,从新建队列。直到找完 d[0];

#include <bits/stdc++.h>
using namespace std; const int maxn = + ;
const int INF = ; struct Edge
{
int u,v,c;
Edge(int u=,int v = ,int c = ) : u(u),v(v),c(c) {}
}; int n,m;
vector<Edge> edges;
vector<int> G[maxn]; void AddEdge(int from,int to,int c)
{
edges.push_back(Edge(from,to,c));
int idx = edges.size();
G[from].push_back(idx-);
} int d[maxn];
bool vis[maxn];
vector<int> ans; void rev_bfs()
{
memset(vis, , sizeof(vis));
d[n-] = ;
vis[n-] = true; queue<int> q;
q.push(n-);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = ; i < G[u].size(); i++)
{
Edge _edge = edges[G[u][i]];
int v = _edge.v;
if(!vis[v])
{
vis[v] = true;
d[v] = d[u] + ;
q.push(v);
}
}
}
} void bfs()
{
memset(vis,,sizeof(vis));
vector<int> next;
next.push_back();
vector<int> ans;
for(int i=; i<d[]; i++)
{
int min_color = INF; for(int j=; j<next.size(); j++) ///队列中一个级别的结点
{
int u = next[j]; for(int k=; k<G[u].size(); k++)
{
Edge _edge = edges[G[u][k]];
int v = _edge.v;
if(d[u]==d[v]+)
min_color = min(min_color,_edge.c);
} }
ans.push_back(min_color); vector<int> next2; for(int j=; j<next.size(); j++)
{
int u = next[j];
for(int k=; k<G[u].size(); k++)
{
Edge _edge = edges[G[u][k]];
int v = _edge.v;
if(d[u]==d[v]+&&vis[v]==false&&_edge.c==min_color)
{
vis[v] = ;
next2.push_back(v);
}
}
}
next = next2;
} printf("%d\n", ans.size());
printf("%d", ans[]);
for(int i = ; i < ans.size(); i++)
printf(" %d", ans[i]);
printf("\n"); } int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(d,,sizeof(d));
edges.clear();
for(int i=;i<n;i++)
G[i].clear();
for(int i=; i<m; i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
u--;
v--;
AddEdge(u,v,c);
AddEdge(v,u,c);
}
rev_bfs();
bfs();
} return ;
}

Uva 1599 最佳路径的更多相关文章

  1. UVa 1599 理想路径(反向BFS 求最短路径 )

    题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数 ...

  2. ArcGIS 网络分析[1.2] 利用1.1的线shp创建网络数据集/并简单试验最佳路径

    上篇已经创建好了线数据(shp文件格式)链接:点我 这篇将基于此shp线数据创建网络数据集. 在此说明:shp数据的网络数据集仅支持单一线数据,也就是说基于shp文件的网络数据集,只能有一个shp线文 ...

  3. 使用 EOLINKER 进行接口测试的最佳路径 (下)

    本文为 <使用 EOLINKER 进行接口测试的最佳路径> 下半部分文章,主要介绍测试脚本如何执行和报告生成,以及测试项目人员如何协作.还没看过上篇文章请戳 使用 EOLINKER 进行接 ...

  4. 寻找最佳路径(ArcPy实现)

    一.背景 随着社会经济发展需求,公路的重要性日益提高.在一些交通欠发达的地区,公路建设迫在眉睫.如何根据实际地形情况设计出比较合理的公路规划,是一个值得研究的问题. 二.实验目的: (1)通过练习,熟 ...

  5. UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)

    大体思路是从终点反向做一次BFS得到一个层次图,然后从起点开始依次向更小的层跑,跑的时候选则字典序最小的,由于可能有多个满足条件的点,所以要把这层满足条件的点保存起来,在跑下一层.跑完一层就会得到这层 ...

  6. UVa 1599 (字典序最小的最短路) Ideal Path

    题意: 给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号.在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径. 分析: 首先从节点n到节点1倒着BFS一次,算出每个节点到节点n ...

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

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

  8. UVA 1599 Ideal Path (HDU 3760)

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

  9. Uva 1599 Ideal Path - 双向BFS

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

随机推荐

  1. int 与 Integer--话说数组转集合

    话说是自从JDK5后,而这就可以自动进行类型转换了. 当然,区别还是有的,就是对象和“非对象”什么的.可是,今天进行一个测试,出了一个小问题,现将代码贴下: 代码0:先来一个正常点的,用String进 ...

  2. MES: ESB

    ESB定义了消息的收发和收发池,对于各种通讯方式定义了收发API,在收到信息后由eventBus来发布消息 ISender: public abstract interface ISender { p ...

  3. struts_24_基于XML校验的规则、特点

    当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下 ...

  4. $.toJSON的使用方法

    我们都会使用jQuery的ajax方法取得json数据但是我们有的时候也要使用json数据给PHP传值,这个怎么做哪? 首先去http://code.google.com/p/jquery-json/ ...

  5. c语言小程序

    这是一个用c语言写的小程序,功能是随机输出30道100以内的四则运算,先生成两个随机数,再通过随机数确定四则运算符号,最后输出题目. #include<iostream> using na ...

  6. js表单提交一种方式

    在一个html和php混编的文件中,用到js提交表单的方法: 定义表单id为form1,提交按钮type为submit, var data_info = document.getElementById ...

  7. yii2的redis扩展使用

    yii2支持了redis扩展,不需要在本地下载php的扩展库就可以很好的使用 1.下载windows的redis安装包打开cmd,进入安装包目录,使用redis-server.exe redis.co ...

  8. Linux下/etc/resolv.conf 会被重新写入

    主要原因是因为安装了network manager,所以在启动后每次都会重写这个文件. 所以需要在network manager->eth0->ipv4->Automatic(DHC ...

  9. OpenStack 的windows镜像的开启办法

    创建虚拟机 使用我们的管理平台的windows主机创建流程,创建一台主机.在vnc中能看到主机进入到系统中 需要点击按钮sendctrl进入输入密码阶段. 输入我们的镜像的默认密码:5@mdjkw 打 ...

  10. Android中的通知—Notification 自定义通知

    Android中Notification通知的实现步骤: 1.获取NotificationManager对象NotificationManager的三个公共方法:①cancel(int id) 取消以 ...