题目大意:

对于一个n个房间m条路径的迷宫(Labyrinth)(2<=n<=100000, 1<=m<=200000),每条路径上都涂有颜色,颜色取值范围为1<=c<=10^9。求从节点1到节点n的一条路径,使得经过的边尽量少,在这样的前提下,如果有多条路径边数均为最小,则颜色的字典序最小的路径获胜。一条路径可能连接两个相同的房间,一对房间之间可能有多条路径。输入保证可以从节点1到达节点n。

这题思路很简单但还真没少折腾,前后修改提交了七八次才AC...(也说明自己有多菜了)..

注意问题:

1.看清楚原题的输入输出要求,刚了书上的中文题目直接开撸,以为输入输出都是只有一个情况的,所以一开始没加循环导致了WA

2. bfs要解决重复入队问题,在bfs1中由于一开始的方法导致重复入队,提交后TLE

3. 将d数组初始化为一个较大的整数 INF = 0x5ffffff ,然后找最小颜色的时候比INF小就修改,提交后WA,原因可能为测试数据中存在颜色号码真的为INF的数据,改为用-1充当INF

总结:

1.要看清楚原题的输入输出要求

2.bfs重复入队问题的解决方法

3.INF标识尽量用题目不可能出现的数据,如果数据都是正整数,可用-1

AC代码:

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stdio.h>
#include <algorithm>
#define maxn 100005
using namespace std;
struct ver
{
int next,color;
ver(int a,int b) : next(a),color(b) {}
ver() {}
}; vector<ver> G[maxn];
int vis[maxn];
int d[maxn];
int n,m;
int res[maxn];
int inque[maxn]; void bfs1()
{
memset(d,-1,sizeof(d));
int u,t;
queue<int> Q;
d[n] = 0;
Q.push(n);
while(!Q.empty())
{
t = Q.front(); Q.pop();
int sz = G[t].size();
for(int i =0; i < sz; ++i)
{
u = G[t][i].next;
if(u == 1)
{
d[1] = d[t] + 1;
return;
}
if(d[u] == -1) //未访问过
{
d[u] = d[t] + 1;
Q.push(u);
}
}
}
} void bfs2()
{ memset(res,0,sizeof(res));
memset(inque,0,sizeof(inque));
queue<int> Q;
int end,clr,minc;
int begin = 1;
Q.push(begin);
while(!Q.empty())
{
begin = Q.front(); Q.pop();
if(begin == n) return;
minc = -1;
for(int i = 0; i< G[begin].size(); i++) //1st find min color
{
end = G[begin][i].next;
clr = G[begin][i].color;
if(d[end] == d[begin]-1)
{
if(minc == -1) minc = clr;
else minc = min(minc,clr);
}
}
int index = d[1] - d[begin]; //当前步长
if(res[index] == 0) res[index] = minc;
else res[index] = min(res[index],minc); for(int j = 0; j < G[begin].size();j++) //2st go
{
end = G[begin][j].next;
clr = G[begin][j].color;
if(clr == minc && d[end] == d[begin]-1 && !inque[end])
{
Q.push(end);
inque[end] = 1;
}
} }
} int main()
{
int a,b,c;
while(scanf("%d %d",&n,&m) == 2)
{
for(int i = 0; i <= n; ++i) G[i].clear();
for(int i = 0; i < m; ++i)
{
scanf("%d %d %d",&a,&b,&c);
if(a == b) continue;
ver edge1(b,c);
ver edge2(a,c);
G[a].push_back(edge1);
G[b].push_back(edge2);
}
bfs1();
bfs2(); printf("%d\n",d[1]);
printf("%d",res[0]);
for(int i = 1; i < d[1]; ++i)
printf(" %d",res[i]);
printf("\n");
}
return 0;
}

  

Uva 1599 Ideal Path - 双向BFS的更多相关文章

  1. UVa 1599 Ideal Path【BFS】

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

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

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

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

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

  4. UVa 1599 Ideal Path (两次BFS)

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

  5. UVA 1599 Ideal Path (HDU 3760)

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

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

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

  7. UVA 1599 Ideal Path

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

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

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

  9. POJ——3126Prime Path(双向BFS+素数筛打表)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16272   Accepted: 9195 Descr ...

随机推荐

  1. cleanMyMac

    想看外国网站可以找我,facebook.youtube.XX大片等,只要8元钱,无限制用到服务器关闭.看大片流畅不成问题 需要cleanMyMac的请加微信只要10或直接拍 http://a.p6ff ...

  2. 【开源】AspnetCore 2.0 自动API文档生成组件,支持protobuffer

    本文地址 http://www.cnblogs.com/likeli/p/8204054.html 关于 API文档自动生成,用于对APP端的开发帮助文档生成,默认ProtoBuffer传输格式. 本 ...

  3. 微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用

    说说最近在开发微信小程序语音识别遇到的问题吧 最先使用微信小程序录音控件可以拿到silk格式,后来微信官方又支持mp3格式了 但是我们拿到这些格式以后,都还不能直接使用,做语音识别,因为目前百度的语音 ...

  4. JAVA NIO学习四:Path&Paths&Files 学习

    今天我们将学习NIO 的最后一章,前面大部分涉及IO 和 NIO 的知识都已经讲过了,那么本章将要讲解的是关于Path 以及Paths 和 Files 相关的知识点,以对前面知识点的补充,好了言归正传 ...

  5. 利用USearch去除嵌合体(chimeras)

    嵌合体序列指在pcr过程中,两条不同的序列产生杂交扩增的序列,属于人工污染,在ITS和16S分析中,应该首先去除,USearch提供去除嵌合体的功能 usearch -uchime_ref reads ...

  6. Python day 7(2) 类和实例(1)

    一:面向对象编程 1  面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 2 ...

  7. 一张图,理解JAVA体系结构、运行机制、JVN运行机制、Java平台(初学)

    初学JAVA,学一门语言不仅仅是学其语法,逻辑思维能力,还有每一门语言都有自己独特的一方面,所以才有那么多语言要学啊 = =,所以想要真的学好语言,其编译机制,运行机制多少也要涉猎一些啊.这是初学JA ...

  8. Robot Framework学习笔记(十一)------ 分层设计

    以百度搜索为例,如果我们需要写5个不同关键字搜索的用例.如果没有分层的思想,那么我们需要写5个用例,并且每个用例都需要重复写打开浏览器.输入关键字.点击按钮.关闭浏览器的步骤.如果使用Robot Fr ...

  9. SQL Server Service Broker创建单个数据库会话

    概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...

  10. Jenkins远程部署SpringBoot应用

    一般Web工程通过Jenkins远程部署到Tomcat,可以采用Maven的tomcat-maven-plugin插件进行部署.最近接触到Spring Boot工程的部署,由于Spring Boot应 ...