题意:

给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号。在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径。

分析:

首先从节点n到节点1倒着BFS一次,算出每个节点到节点n个最短距离di

然后从节点1开始再一次BFS,在寻找下一个节点时,必须满足下一个节点v满足对于当前节点u,有du = dv + 1,这样才能保证在最短路上。

在这个条件下还要满足v的颜色编号是最小的。因为可能有多个颜色相同的最小编号,所以这些节点都要保留下来。

图的表示方式:这里如果再用往常的邻接表发现不适用了,所以G[u]中保存的与u邻接的edges中边的编号。

 #include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <algorithm>
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) {}
}; vector<Edge> edges;
vector<int> G[maxn]; void AddEdge(int u, int v, int c)
{
edges.push_back(Edge(u, v, c));
int index = edges.size() - ;
G[u].push_back(index);
} int n, d[maxn];
bool vis[maxn];
vector<int> ans; void rev_bfs()
{
memset(vis, , sizeof(vis));
queue<int> q;
q.push(n-);
vis[n-] = true;
d[n-] = ; while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = ; i < G[u].size(); ++i)
{
int e = G[u][i];
int v = edges[e].v;
if(!vis[v])
{
vis[v] = true;
d[v] = d[u] + ;
q.push(v);
}
}
}
} void bfs()
{
memset(vis, , sizeof(vis));
vis[] = true;
ans.clear(); vector<int> next;
next.push_back();
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)
{
int e = G[u][k];
int v = edges[e].v;
if(d[u] == d[v] + )
min_color = min(min_color, edges[e].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)
{
int e = G[u][k];
int v = edges[e].v;
if(!vis[v] && d[u] == d[v] + && edges[e].c == min_color)
{
vis[v] = true;
next2.push_back(v);
}
}
}
next = next2;
} printf("%d\n%d", d[], ans[]);
for(int i = ; i < ans.size(); ++i) printf(" %d", ans[i]);
puts("");
} int main()
{
//freopen("in.txt", "r", stdin);
int m, u, v, c;
while(scanf("%d%d", &n, &m) == )
{
edges.clear();
for(int i = ; i < n; ++i) G[i].clear();
while(m--)
{
scanf("%d%d%d", &u, &v, &c);
if(u == v) continue; //最短路中一定不含环
AddEdge(u-, v-, c);
AddEdge(v-, u-, c);
} rev_bfs();
bfs();
} return ;
}

代码君

UVa 1599 (字典序最小的最短路) Ideal Path的更多相关文章

  1. sdut3562-求字典序最小的最短路 按顶点排序后spfa的反例

    首先我们可以这么搞...倒序建图,算出源点s附近的点距离终点的距离,然后判断一下,终点是否能跑到源点 能跑到的话呢,我们就判断s周围的点是否在最短路上,然后我们选编号最小的点就好了 代码 #inclu ...

  2. HDU1385 【输出字典序最小的最短路】

    这题经过的结点比较好处理. 主要是字典序的处理. 先是floyd做法,采用记录后驱的方法.  path[i][j]=j[初始化...] #include <iostream> #inclu ...

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

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

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

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

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

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

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

    题目大意: 对于一个n个房间m条路径的迷宫(Labyrinth)(2<=n<=100000, 1<=m<=200000),每条路径上都涂有颜色,颜色取值范围为1<=c&l ...

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

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

  8. HDU 1385 Minimum Transport Cost (输出字典序最小路径)【最短路】

    <题目链接> 题目大意:给你一张图,有n个点,每个点都有需要缴的税,两个直接相连点之间的道路也有需要花费的费用.现在进行多次询问,给定起点和终点,输出给定起点和终点之间最少花费是多少,并且 ...

  9. UVA 1599 Ideal Path

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

随机推荐

  1. UTF8后MD5

    function ToUTF8Encode(str: string): string; //将字符串转UTF8编码 var b: Byte; begin for b in BytesOf(UTF8En ...

  2. LeetCode 解题报告--202Happy Number

    1 题目描述 Write an algorithm to determine if a number is "happy". A happy number is a number ...

  3. php-fpm.conf 文件详解

    pid string PID文件的位置. 默认为空. error_log string 错误日志的位置. 默认: 安装路径#INSTALL_PREFIX#/log/php-fpm.log. log_l ...

  4. MySQL 5.1.63 单机配置多实例(简单配置)

    需求: 在一台服务器上通过源码编译安装一个版本为5.1.63版本MySQL数据库: 方案:将所有配置文件与数据等均存放在/home/zhaoshuangshuang下.在同一个MySQL中运行两个实例 ...

  5. 一步步学习ASP.NET MVC3 章节总结

    请注明转载地址:http://www.cnblogs.com/arhat 对于<一步步学习ASP.NET MVC3>系列工15章,那么为了方便大家能够快速的预览,老魏在这里为这个系列提供一 ...

  6. Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)

    最近在做项目时用到了定时执行的js方法,setInterval与setTimeout时间长了不用有些生疏了,所以自己总结了一下,记下来,以便以后使用. Document自带的方法: 循环执行:var ...

  7. MS Translator

    在看白老师的书的时候看到的,现在MS已经开始转向服务,真对不同行业具有不同的服务,有些免费的,还是十分值得我们借用的,毕竟是大公司出来的产品,都会保证SLA的. 不多说了,直接上地址: https:/ ...

  8. Windows下配置使用 MemCached

    Windows下配置使用MemCached 工具: memcached-1.2.6-win32-bin.zip     MemCached服务端程序(for win) Memcached Manage ...

  9. IntelliJ IDEA 部署Tomcat及创建一个web工程

    一.部署Tomcat 二.新建一个web工程 1.新建一个Project 2.现在建立一个简单的web工程,所以只勾选下面选中的,此外,本版本(IntelliJ IDEA 14.1.5只支持3.1版本 ...

  10. P​H​P​ ​5​.​3​连​接​s​q​l​ ​s​e​r​v​e​r​ ​2​0​0​8​ ​R​2

    我的机器为: xp sp3 sql server 2008 developer apache 2.2.2 php 5.3  从5.3开始,php就不再提供mssql.dll了,所以要php连接sql  ...