为什么都说简单好想咧。坦白从宽看了人家的代码,涨了好多姿势,,

http://blog.csdn.net/u013382399/article/details/38227917

被一个细节坑了。。

2147483647是0x7fffffff啊啊啊,7个f!!!

 #include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <cctype>
#include <algorithm>
#include <cmath>
#include <deque>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <iomanip>
using namespace std; #define INF 0x7fffffff
#define maxn 100000+10 int n, m;
vector<int> g[maxn];//用以存放互相连通的房间
vector<int> col[maxn];//用以存放走廊颜色
int step[maxn];//存放由n到i的最短步数
int ans[maxn*];
int vis[maxn];
void init()
{
for(int i = ; i < maxn; i++)
{
g[i].clear();
col[i].clear();
}
memset(step, -, sizeof(step));
memset(ans, , sizeof(ans));
memset(vis, , sizeof(vis));
}
//==============获得到n的最少步数(逆向由n到1)===========
void bfs1()
{
queue<int> q;
q.push(n);
step[n] = ;//初始,由n到n的最短步数为0
while(!q.empty())
{
int u = q.front(); q.pop();
int sz = g[u].size();
for(int i = ; i < sz; i++)
{
int v = g[u][i]; if(v == )
{
step[v] = step[u]+;
return ;
} if(step[v] == -)
{
step[v] = step[u]+;
q.push(v);
}
}
}
return ;
} //==========获得最少步数时的最小走廊颜色===========
void bfs2()
{
queue<int> q;
q.push();
while(!q.empty())
{
int u = q.front(); q.pop();
///
if(!step[u]) return ;//到达n
///
int mmin = INF;
int sz = g[u].size();
for(int i = ; i < sz; i++)
{
int v = g[u][i];
if(step[v] == step[u]-)
{
mmin = min(mmin, col[u][i]);//注意理解c[u][i]与g[u][i]间的联系--c[u][i]是u连接g[u][i]的走廊颜色
}
}
//==========以上获得了从1出发最短路中每步的最小色 int tmp_step = step[] - step[u];//从1到u的步数,即出发第tmp_step步
//ans[tmp_step] = (ans[tmp_step] == 0 ? mmin : min(mmin, ans[tmp_step]));
if(ans[tmp_step] == ) ans[tmp_step] = mmin;
else ans[tmp_step] = min(ans[tmp_step], mmin); for(int i = ; i < sz; i++)
{
int v = g[u][i];
///该处判断条件很重要,把走过的路做标记
if(!vis[v] && step[v] == step[u]- && mmin == col[u][i])
{
vis[v] = ;
q.push(v);
}
}
}
return ;
}
int main()
{
//===================input=====================
while(~scanf("%d%d", &n, &m))
{
init();
while(m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a == b) continue;
g[a].push_back(b);
g[b].push_back(a);
col[a].push_back(c);
col[b].push_back(c);
}
//===============逆向bfs===============
//============获得最短步数=============
bfs1();
//===============正向bfs===============
//==========获得每步的走廊颜色=========
bfs2(); printf("%d\n", step[]);
for(int i = ; i < step[]; i++)
{
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
return ;
}

逆向+两次bfs(UVA 1599)的更多相关文章

  1. UVa 1599 Ideal Path (两次BFS)

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

  2. UVa 11624,两次BFS

    题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...

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

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

  4. UVa 1599 理想路径(反向BFS 求最短路径 )

    题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数 ...

  5. Fire! UVA - 11624 (两步bfs)

    题目链接 题意 人要从迷宫走出去,火会向四个方向同时扩散 分析 两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能 ...

  6. UVA 1599 Ideal Path (HDU 3760)

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

  7. POJ 1475 Pushing Boxes 搜索- 两重BFS

    题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...

  8. HDU2612---(两次BFS)

    Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...

  9. CSU - 2031 Barareh on Fire (两层bfs)

    传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...

随机推荐

  1. 【转】iPhone 6 屏幕揭秘

    http://www.cocoachina.com/design/20141218/10680.html 一根线的渲染 为了说明多种设备的不同像素渲染情况,我们比较了一个一像素宽的线是怎样渲染的: 最 ...

  2. CodeForces 489B BerSU Ball (贪心)

    BerSU Ball 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/E Description The Berland Stat ...

  3. thymeleaf学习

    一.简单表达格式:   thymeleaf的官方参考文档 1.变量的表达式:${...} 2.选择变量表达式:*{...} 3.信息表达:#{...} 4.链接URL表达式:@{...} 二.字面值 ...

  4. JMS开发(三):JMS消息的确认方式

    这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视. 首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息. 对于非事务性会话, ...

  5. [转]Oracle关于null的处理

    转至:http://www.2cto.com/database/201209/157606.html 关于空值null的排序问题   Oracle排序中NULL值处理的五种常用方法:    1.缺省O ...

  6. 利用CSS3实现页面淡入动画特效

    利用CSS3动画属性"@keyframes "可实现一些动态特效,具体语法和参数可以网上自行学习.这篇文章主要是实践应用一下这个动画属性,实现页面淡入特效,在火狐24版.chrom ...

  7. C#一些知识点:委托和事件的区别

    在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别. 定义上的区别 委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针. 事件:事件是一个修饰 ...

  8. Jquery EasyUi实战教程布局篇

    转自:http://www.kwstu.com/ArticleView/kwstu_20139413501290 送给大家一个非常好的后台布局模板,本人后来就选择了这个模板http://www.kws ...

  9. Angularjs 初始化框架

    bindJQuery(); publishExternalAPI(angular); jqLite(document).ready(function() { angularInit(document, ...

  10. java虚拟机JVM学习笔记-基础知识

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--java虚拟机 媒介:JVM是每一位从事Java开发工程师必须翻越的一座大山! JVM(Java Virtual Machine)JRE ...