题意:

给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号。在从节点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. NVIDIA显卡设置提升MineCraft流畅度

    很喜欢MineCraft(我的世界)这款游戏.可09年Y450的配置现在看来有点弱,尽管将Y450的CPU升级至了2.8Ghz的T9600,内存升级至1066Mhz的4G双通道内存,硬盘更换为128G ...

  2. 1027 Colors in Mars (20)

    #include <stdio.h> #include <map> using namespace std; int main() { int R,G,B,i; map< ...

  3. ajax,json和$.each()

    json返回的时候,只需要展示部分字段,如果是 ajax从后台获取结果处理,可以使用.select() 等处理结合匿名类,生成需要的字段的匿名类json字符串,返回前端,可以使用$.parseJson ...

  4. net use命令详细解释

    1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连接: net use \ ...

  5. swift基础--变量

    (1)变量与常量 (2)基本类型 (3)强制转换 (4)Bool类型 (5)元组 (6)可选值 //变量和常量 var str = "Hello, playground" let  ...

  6. Contest2037 - CSU Monthly 2013 Oct (problem A :Small change)

    [题解]:二进制拆分 任意一个整数都可以拆分成 2^0 + 2^1 + 2^2 + 2^3 + ....+ m [code]: #include <iostream> #include & ...

  7. vs2008+cmake2.8+OpenCV2.8.4配置过程中OpenCV.sln重编译部分工程失败

    解决方法来自此链接 http://www.tuicool.com/articles/qiQBb2N vs2008+cmake2.8+OpenCV2.8.4配置过程 1.解压opencv2.4.8 2. ...

  8. [转载]jquery tmpl使用方法

    动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等. 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在 ...

  9. 团体程序设计天梯赛-练习集L1-015. 跟奥巴马一起画方块

    L1-015. 跟奥巴马一起画方块 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 美国总统奥巴马不仅呼吁所有人都学习编程,甚至 ...

  10. hdu 1561

    有依赖的背包,用树形dp解 #include<iostream> #include<cstdio> #include<cstring> #include<al ...