逆向+两次bfs(UVA 1599)

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

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

被一个细节坑了。。

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

  1 #include <iostream>
  2 #include <sstream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <string>
  7 #include <vector>
  8 #include <set>
  9 #include <cctype>
 10 #include <algorithm>
 11 #include <cmath>
 12 #include <deque>
 13 #include <queue>
 14 #include <map>
 15 #include <stack>
 16 #include <list>
 17 #include <iomanip>
 18 using namespace std;
 19
 20 #define INF 0x7fffffff
 21 #define maxn 100000+10
 22
 23 int n, m;
 24 vector<int> g[maxn];//用以存放互相连通的房间
 25 vector<int> col[maxn];//用以存放走廊颜色
 26 int step[maxn];//存放由n到i的最短步数
 27 int ans[maxn*2];
 28 int vis[maxn];
 29 void init()
 30 {
 31     for(int i = 0; i < maxn; i++)
 32     {
 33         g[i].clear();
 34         col[i].clear();
 35     }
 36     memset(step, -1, sizeof(step));
 37     memset(ans, 0, sizeof(ans));
 38     memset(vis, 0, sizeof(vis));
 39 }
 40 //==============获得到n的最少步数(逆向由n到1)===========
 41 void bfs1()
 42 {
 43     queue<int> q;
 44     q.push(n);
 45     step[n] = 0;//初始,由n到n的最短步数为0
 46     while(!q.empty())
 47     {
 48         int u = q.front(); q.pop();
 49         int sz = g[u].size();
 50         for(int i = 0; i < sz; i++)
 51         {
 52             int v = g[u][i];
 53
 54             if(v == 1)
 55             {
 56                 step[v] = step[u]+1;
 57                 return ;
 58             }
 59
 60             if(step[v] == -1)
 61             {
 62                 step[v] = step[u]+1;
 63                 q.push(v);
 64             }
 65         }
 66     }
 67     return ;
 68 }
 69
 70 //==========获得最少步数时的最小走廊颜色===========
 71 void bfs2()
 72 {
 73     queue<int> q;
 74     q.push(1);
 75     while(!q.empty())
 76     {
 77         int u = q.front(); q.pop();
 78         ///
 79         if(!step[u])    return ;//到达n
 80         ///
 81         int mmin = INF;
 82         int sz = g[u].size();
 83         for(int i = 0; i < sz; i++)
 84         {
 85             int v = g[u][i];
 86             if(step[v] == step[u]-1)
 87             {
 88                 mmin = min(mmin, col[u][i]);//注意理解c[u][i]与g[u][i]间的联系--c[u][i]是u连接g[u][i]的走廊颜色
 89             }
 90         }
 91         //==========以上获得了从1出发最短路中每步的最小色
 92
 93         int tmp_step = step[1] - step[u];//从1到u的步数,即出发第tmp_step步
 94         //ans[tmp_step] = (ans[tmp_step] == 0 ? mmin : min(mmin, ans[tmp_step]));
 95         if(ans[tmp_step] == 0)  ans[tmp_step] = mmin;
 96         else ans[tmp_step] = min(ans[tmp_step], mmin);
 97
 98         for(int i = 0; i < sz; i++)
 99         {
100             int v = g[u][i];
101             ///该处判断条件很重要,把走过的路做标记
102             if(!vis[v] && step[v] == step[u]-1 && mmin == col[u][i])
103             {
104                 vis[v] = 1;
105                 q.push(v);
106             }
107         }
108     }
109     return ;
110 }
111 int main()
112 {
113     //===================input=====================
114     while(~scanf("%d%d", &n, &m))
115     {
116         init();
117         while(m--)
118         {
119             int a, b, c;
120             scanf("%d%d%d", &a, &b, &c);
121             if(a == b) continue;
122             g[a].push_back(b);
123             g[b].push_back(a);
124             col[a].push_back(c);
125             col[b].push_back(c);
126         }
127         //===============逆向bfs===============
128         //============获得最短步数=============
129         bfs1();
130         //===============正向bfs===============
131         //==========获得每步的走廊颜色=========
132         bfs2();
133
134         printf("%d\n", step[1]);
135         for(int i = 0; i < step[1]; i++)
136         {
137             if(i) printf(" ");
138             printf("%d", ans[i]);
139         }
140         printf("\n");
141     }
142     return 0;
143 }

逆向+两次bfs(UVA 1599)

时间: 2024-10-14 06:55:00

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

UVa 1599 Ideal Path (两次BFS)

题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径. 析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好做,事实用两次BFS, 第一次是倒序BFS,目的是得到从结点 i 到结点n的最短距离,然后再从第一个点开始到最后一个,要保证在查找时,每经过一点要让d值恰好减少1, 直到终点,这也是一个BFS,因为这个字典序在某个结点是一样的,所以是两个BFS,我超时了好几次,因为少写了一个vis, 一定要细心,

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

题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数, 如果最少步数相同有多条路径, 那么输出权值字典序最小的一条. 分析: 用BFS解决最短路问题, 可以先从终点BFS, 求出每个点到终点的最短距离. 那么最少步数就是起点的最短距离, 最短路径就是从起点每次向最短距离比自己少1的顶点移动(如果有多个则可以随便走), 这样就可以保证走的是最短路径, 如果一开始

uva11624 - Fire! 两次bfs

题目链接 Problem B: Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help Joe escape the maze. Given Joe's location in the maze and which squares of the

求树的直径【两遍BFS】

两遍BFS.从任意一个点出发,第一遍可以找到直径的一端,从这端出发即可找到另外一端. 证明:从U点出发,到达V[画个图便清晰了] 1.如果U在直径上,则V一定是直径的一个端点. 2.如果U不在直径上.U,V线一定和直径有交点(如果没有交点,从U引一条路到直径交于U'.[反证]).有交点则V一定是直径另一端. 代码:[举例] int path(int x){ //从x出发,求直径 mem(vis,-1); while(!Q.empty()) Q.pop(); Q.push(x); vis[x]=0

URAL 1145. Rope in the Labyrinth(两次BFS啊 )

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1145 1145. Rope in the Labyrinth Time limit: 0.5 second Memory limit: 64 MB A labyrinth with rectangular form and size m × n is divided into square cells with sides' length 1 by lines that are paralle

hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)

#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已. 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =).小Ho手中的这棵玩具树现在由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不

hdu-2612 两次bfs

http://acm.hdu.edu.cn/showproblem.php?pid=2612 两次bfs, 记录到每个KFC的最短时间.选取最短时间. #include <stdio.h> #include <iostream> #include <string> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #inc

FZU 2196 Escape (两次BFS)

[题目链接]:click here~~ [题目大意]: Description 小明进入地下迷宫寻找宝藏,找到宝藏后却发生地震,迷宫各处产生岩浆,小明急忙向出口处逃跑.如果丢下宝藏,小明就能迅速离开迷宫,但小明并不想轻易放弃自己的辛苦所得.所以他急忙联系当程序员的朋友你(当然是用手机联系),并告诉你他所面临的情况,希望你能告诉他是否能成功带着宝藏逃脱. Input 有多组测试数据. 每组测试数据第一行是一个整数T,代表接下去的例子数.(0<=T<=10) 接下来是T组例子. 每组例子第一行是两

POJ 3170 Knights of Ni(两次BFS啊)

题目链接:http://poj.org/problem?id=3170 Description Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded by the Knights of Ni. In order to pass through safely, the Knights have demanded that sh