题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径。

析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好做,事实用两次BFS,

第一次是倒序BFS,目的是得到从结点 i 到结点n的最短距离,然后再从第一个点开始到最后一个,要保证在查找时,每经过一点要让d值恰好减少1,

直到终点,这也是一个BFS,因为这个字典序在某个结点是一样的,所以是两个BFS,我超时了好几次,因为少写了一个vis, 一定要细心,

据说可以只用一次BFS,倒序,如果有兴趣可以尝试,反正我暂时没想出来,毕竟倒着字典序不好找.

再就是这个图不好构造,不能用二维数组,我用一个vector来存在,用了2*n个长度,偶数下标存结点,奇数存颜色,遍历时要注意是+2, 不是++.

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring> using namespace std;
const int maxn = 200000 + 5;
const int INF = 0x3f3f3f3f;
int d[maxn], vis[maxn], ans[maxn];
vector<int> v[maxn];
int Min(int a, int b){ return a < b ? a : b; } void bfs1(int n){//逆序BFS
memset(d, 0, sizeof(d));
queue<int> q;
memset(vis, 0, sizeof(vis));
q.push(n);
vis[n] = 1; while(!q.empty()){
int u = q.front(); q.pop();
for(int i = 0; i < v[u].size(); i += 2){
int t = v[u][i];
if(t == 1){ d[1] = d[u] + 1; return; }//小优化,找到1就行了
if(vis[t])continue;
d[t] = d[u] + 1;
vis[t] = 1;
q.push(t);
}
}
} void bfs2(int n){
memset(vis, 0, sizeof(vis));
queue<int> q;
q.push(n);
vis[n] = 1;
fill(ans, ans+d[1]+1, INF); while(!q.empty()){
int u = q.front(); q.pop();
if(!d[u]) return ;
int m = INF;
for(int i = 1; i < v[u].size(); i += 2)
if(d[u] == d[v[u][i-1]]+1) m = Min(m, v[u][i]); ans[d[1]-d[u]] = Min(ans[d[1]-d[u]], m);
for(int i = 0; i < v[u].size(); i += 2)
if(!vis[v[u][i]] && d[u] == d[v[u][i]]+1 && v[u][i+1] == m){
vis[v[u][i]] = 1;
q.push(v[u][i]);
}
}
} int main(){
// freopen("in.txt", "r", stdin);
int n, m;
while(scanf("%d %d", &n, &m) == 2){
for(int i = 1; i <= n; ++i) v[i].clear();
int x, y, w;
for(int i = 0; i < m; ++i){
scanf("%d %d %d", &x, &y, &w);
v[x].push_back(y);
v[x].push_back(w);
v[y].push_back(x);
v[y].push_back(w);
} bfs1(n);
bfs2(1);
printf("%d\n", d[1]);
for(int i = 0; i < d[1]; ++i)
if(!i) printf("%d", ans[i]);
else printf(" %d", ans[i]);
printf("\n");
}
return 0;
}

UVa 1599 Ideal Path (两次BFS)的更多相关文章

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

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

  2. UVA 1599 Ideal Path (HDU 3760)

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

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

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

  4. Uva 1599 Ideal Path - 双向BFS

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

  5. UVa 1599 Ideal Path【BFS】

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

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

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

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

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

  8. UVA 1599 Ideal Path

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

  9. UVA 11624 Fire!(两次BFS+记录最小着火时间)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

随机推荐

  1. 纯php实现中秋博饼游戏(1):绘制骰子图案

    最近公司中秋博饼(在厦门),自己没事也想玩玩,所以就想动手写了一个纯php实现的中秋博饼游戏,既然要纯php实现,就要用php来生成图案,所以第一步就先绘制骰子图案. 平时很少使用php绘图,不过查查 ...

  2. System.IO.Path类

    System.IO.Path为路径的操作封装了很多很有的东西,利用该类提供的方法能够快速处理路径操作的问题.下面详细了解一下. 1.属性 属性太复杂了,反映什么系统平台的信息,看不懂,等以后看得懂了再 ...

  3. Sql Server中的事务隔离级别

    数据库中的事物有ACID(原子性,一致性,隔离性,持久性)四个特性.其中隔离性是用来处理并发执行的事务之间的数据访问控制.SqlServer中提供了几种不同级别的隔离类型. 概念 Read UnCom ...

  4. 使用纯生js实现图片轮换

    效果图预览. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. request 里面参数设置 (有空瞄下)

    Requests 是用python语言编写的第三方库,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,完全满足 HTTP 测试需求, ...

  6. 怎么才知道你在使用的是不是中国电信CN2的线路

    原文:http://www.juzhenyun.org/helpview_66.html 首先你能从和电信的合同上确认是否为CN2线路 目前CN2的线路多为商业用途.公司用户申请中国电信的Intern ...

  7. Oracle 性能调优之:使用 V$SQL_PLAN 视图查询内存中的执行计划

    V$SQL_PLAN视图提供了一种方法,可用于检查仍位于库高速缓存的游标的执行计划.此视图中的信息与 PLAN_TABLE 视图中的信息非常类似.但是,EXPLAIN PLAN 显示的是执行相应语句时 ...

  8. bootstrap插件的一些常用属性介绍

    1.下拉菜单 <div class="dropdown"> <button class="btn btn-default dropdown-toggle ...

  9. OpenCL 前缀和

    ▶ 向量前缀和 ● 最简单的版本,代码 #include <stdio.h> #include <stdlib.h> #include <cl.h> const c ...

  10. 关于document.cookie的使用

    设置cookie每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie:document.cookie="userId=828";如果要一次 ...