# UVa 1599 Ideal Path

。这里绝对是个技巧。因为队列中出来的元素必然是兄弟结点全部出来完之后， 才会弹出这些兄弟结点的第一个作为接下来子树的根节点，所以用层数数组可以记录一层边

3 2

1 3 2

2 3 3

1

2

/*=============================================================================
#
#      Author: liangshu - cbam
#
#      QQ : 756029571
#
#      School : 哈尔滨理工大学
#
#
#     Filename: H.cpp
#
#     Description:
#        The people who are crazy enough to think they can change the world, are the ones who do !
=============================================================================*/

#include<iostream>
#include<sstream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<cctype>
#include<string>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int INF=400004;
int inq[INF];
int cnt[INF];
int low[INF];
int n,m,c;
struct Edge
{
int next_edge,v,t,val;
} edge[INF];

void bfs1(int p){
memset(low, -1, sizeof(low));
low[p] = 0;
queue<int>q;
q.push(p);
while(!q.empty()){
int u = q.front();
if(u == 1){
return ;
}
q.pop();
for(int e = head[u]; e != -1; e = edge[e].next_edge){
if(low[edge[e].v] == -1 && edge[e].v != n){
low[edge[e].v] = low[u] + 1;
q.push(edge[e].v);

}
}
}
}
struct Node
{
int x;
Node(int x):x(x){
}
};
int ans[INF];
int vis[INF];
void bfs(int p){
memset(ans, 0, sizeof(ans));
memset(vis, 0, sizeof(vis));
queue<Node>q;
q.push(Node(p));
while(!q.empty()){
int e = q.front().x;
int tmp = -1;
q.pop();
for(int i = head[e]; i != -1; i = edge[i].next_edge){
if(low[edge[i].v] == low[e] - 1){
if(tmp == -1){
tmp = edge[i].val;
}
else{
tmp = min(edge[i].val, tmp);
}
}
}
int t = low[1] - low[e];
if(ans[t] == 0){
ans[t] = tmp;
}
else{
ans[t] = min(tmp, ans[t]);
}
for(int i = head[e]; i != -1; i = edge[i].next_edge){
if(!vis[edge[i].v] && edge[i].val == tmp  && low[edge[i].v] == low[e] - 1){
q.push(edge[i].v);
vis[edge[i].v] = 1;
}
}
}
}
int main()
{
int x,y,z;
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i=0; i<m; i++)
{
scanf("%d%d%d", &x, &y, &z);
if(x == y){
continue;
}
edge[i].v=y;
edge[i].t=1;
edge[i].val = z;

edge[i+m].v=x;
edge[i+m].t=1;
edge[i+ m].val = z;
}
bfs1(n);
bfs(1);
printf("%d\n%d", low[1], ans[0]);
for(int i = 1; i < low[1]; i++)
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}
/*
4 5
1 2 3
2 3 345
3 4 2
4 2 2
1 3 1
*/


• 本文已收录于以下专栏：

## Uva - 1599 - Ideal Path

• zyq522376829
• 2015年06月18日 14:25
• 501

## UVa1599 - Ideal Path

#include #include #include #include using namespace std; const int maxn=100010; const int inf=1
• a197p
• 2015年03月16日 09:01
• 879

## UVa 1599 - Ideal Path <两次BFS>

• kun768
• 2015年02月03日 15:05
• 986

## UVA - 1599 Ideal Path

bfs两次。第一次处理路径长，第二次选边#include #include #include #include #include #include #include #include #include...
• sky980114
• 2017年05月05日 23:12
• 51

## 例题6-20 理想路径 UVa1599

1.题目描述：点击打开链接 2.解题思路：本题要求寻找一条从1到n的路径，使得经过的边数最少，若边数相同时，输出字典序最小的那条路径。路径问题用BFS解决，但本题需要用两次BFS，第一次来统计所有点到...
• u014800748
• 2015年02月10日 16:56
• 2311

## uva 1599 - Ideal Path

#include #include #include #include #include #include #include #include #include #include ...
• u010652938
• 2014年07月29日 09:33
• 893

## UVa 1599 Ideal Path

New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms c...
• c21c21
• 2015年03月24日 21:01
• 205

## Ideal Path UVA - 1599

• now_ing
• 2017年04月11日 10:17
• 64

## UVA 1599 Ideal Path 【两次BFS+贪心】 （好题）

• DrCarl
• 2016年07月24日 22:20
• 165

## UVA 1599 Ideal Path

• qq_33382034
• 2016年08月06日 19:01
• 145

举报原因： 您举报文章：UVa 1599 Ideal Path 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)