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

反省:这道题由于有自环和重边的存在,因此满足条件的一个点可能多次被加到队列,这样的复杂度将会成指数级。没注意到这点TLE了几发。。。如果一个点到另一个点的最短路径只有一条,就不用判断重复了。正是因为重边所以特别需要注意这点

示意图:

学习点:

1.层次图的构建,逆向思维。

2.注意不是简单图的情况,重边和自环。

3.搜索最致命的问题就是状态判重

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue> //#define local
using namespace std;
const int INF = 1e9;
const int maxm = 2e5 + ;
const int maxn = 1e5 + ;
int n; struct Edge
{
int v,c,nxt;
}e[maxm<<]; int d[maxn];
int cnt , head[maxn]; //init head -1
inline void addEdge(int u,int v,int c)
{
// e[cnt].u = u;
e[cnt].v = v;
e[cnt].c = c;
e[cnt].nxt = head[u];
head[u] = cnt++;
} void bfs()
{
queue<int> q;
memset(d,-,sizeof(d));
q.push(n); d[n] = ;
int u,v,i;
while(!q.empty()){
u = q.front(); q.pop();
if(u == ) { printf("%d\n",d[u]); return ;}
for(i = head[u]; ~i ; i = e[i].nxt ){
v = e[i].v;
if(~d[v]) continue;
d[v] = d[u] + ;
q.push(v);
}
}
} bool vis[maxn];
void bfs2()
{
queue<int> q;///复杂度写高了 没有给结点判断重复 指数级
int u = ,v, i;
q.push(u);
int c = INF;//最小color
vector<int> vec;//保存下一个层次的点
memset(vis,false,sizeof(vis));
while(!q.empty()||!vec.empty()) { if(q.empty()) { //保证队列里只有一个层次的点,如果队列空了,说明上一层的点都跑完了,这时候c一定是最小的
for(i = ;i < vec.size();i++) {
int k = vec[i], v = e[k].v;
if(e[k].c == c && !vis[v] ) {//vis[v] 重边
if(e[k].v == n) { printf("%d\n",c); return ;}
q.push(e[vec[i]].v); vis[v] = true;
}
}
vec.clear();
printf("%d ",c); c = INF;
} u = q.front(); q.pop(); for(i = head[u]; ~i ; i = e[i].nxt ) {
v = e[i].v;
if(d[u] - d[v] == && e[i].c <= c) {
vec.push_back(i);
c = e[i].c;
}
}
}
} int main()
{
#ifdef local
freopen("in.txt","r",stdin);
#endif // local
int m;
int u,v,c;
while(~scanf("%d%d",&n,&m)){
memset(head,-,sizeof(head)); cnt = ;
while(m--) {
scanf("%d%d%d",&u,&v,&c);
if(u == v) continue;//忽略自环
addEdge(u,v,c);
addEdge(v,u,c);
}
bfs();
bfs2();
}
return ;
}

UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)的更多相关文章

  1. UVa 1599 Ideal Path (两次BFS)

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

  2. POJ 3126 Prime Path 素数筛,bfs

    题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...

  3. POJ 3216 Prime Path(打表+bfs)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27132   Accepted: 14861 Desc ...

  4. 理想路径——双向BFS

    题目 给n个点m条边(2 ≤ n ≤ 100000,1 ≤ m ≤ 200000)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量的少,在此前提下,经过边的颜色序列的 ...

  5. POJ 3126 Prime Path 解题报告(BFS & 双向BFS)

    题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...

  6. POJ 3126 Prime Path 简单广搜(BFS)

    题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...

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

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

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

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

  9. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

随机推荐

  1. iis部署错误:HTTP 错误 500.21 - Internal Server Error

    将网站发布到IIS,访问发生如下错误: HTTP 错误 500.21 - Internal Server Error处理程序“PageHandlerFactory-Integr”在其模块列表中有一个错 ...

  2. 远程抓取win7 的用户登录时间

    protected void Page_Load(object sender, EventArgs e) { InvokeSystemPS("query user /server:192.1 ...

  3. 51Nod - 1092 回文字符串(添加删除字符LCS变形)

    回文字符串 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符串都可以通过向中间添加一些字符,使之变为回文字符串. 例如:abbc 添加2个字符可以变为 acbbca, ...

  4. 51nod1205(johnson)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1205 题意:中文题诶- 思路:johnson模板题 流水作业调 ...

  5. [NOIP2008] 传球游戏

    1011. [NOIP2008] 传球游戏 http://cogs.pro/cogs/problem/problem.php?pid=1011 ★   输入文件:ballg.in   输出文件:bal ...

  6. iOS风格的弹出框(alert,prompt,confirm)

    前两天,自己写了一个简单的插件,在移动端使用,不管是安卓手机还是iOS系统的手机,弹出框统一使用iOS风格的. 该弹出框是依赖于jQuery的,当然也可以将用jq写的几句代码转换为原生代码. 今天把代 ...

  7. ElasticStack之Logstash安装

    服务器环境 操作系统 Host:port node 1 CentOS 7.2.1511 11.1.11.127:9200 node1 2 CentOS 7.2.1511 11.1.11.128:920 ...

  8. CentOS 7 部署 nginx-1.14.2

    参考:http://www.linuxe.cn/post-168.html 链接:https://pan.baidu.com/s/1NzHIY7mYgHJ6yMF_rdd0ZQ 提取码:n8o9 下载 ...

  9. [题解](组合数学/gcd)luogu_P3166数三角形

    首先转化为ans=所有的组合方式 - 在同一水平/竖直线上 - 在同一斜线上 主要考虑在同一斜线上的情况 首先想到枚举斜率然后在坐标系内平移,以(0,0)为起点,每条线上的点数应该是gcd(x,y)比 ...

  10. mysql5.7安装部署后初始密码查看以及修改

    一.查看初始密码以下两种方法: 1.找到自己的error.log日志文件,执行自己的命令,红色标记的部分为初始化密码. grep 'temporary password' /data/mysql/er ...