UVa 1599 Ideal Path

原创 2015年11月18日 19:52:34

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


一对节点间可能有多条边,一条边可能连接两个相同结点。输入保证结点1 可以到达结点n。

这里用数组模拟链表来存储边。我们首先一次逆向bfs()构造分层网络。然后正向bfs每一步沿着分层步数递减的方向走,每次走的时候标记上在哪一层上走的哪一个颜色边

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

的颜色最小值, 即使他有多个堂兄弟。这样是完全可以理解的。

需要说明的一点是 构造分层网络时用到的vis数组,必须初始化为-1,否则存在bug,比如这组:

3 2

1 3 2

2 3 3

答案是:

1

2

才对。

但是a掉之后 即使vis置为0,也过了。


还有就是在找每个兄弟结点和孩子连边中的最小色彩值的时候。不知道为什么我把tmp设为足够大。然后每步更新tmp直至最小,这样提交结果却是wa。很是郁闷。

/*=============================================================================   
#   
#      Author: liangshu - cbam    
#   
#      QQ : 756029571    
#   
#      School : 哈尔滨理工大学    
#   
#      Last modified: 2015-11-18 19:54  
#   
#     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 head[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)
    {
        memset(head,-1,sizeof(head));
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d", &x, &y, &z);
            if(x == y){
                continue;
            }
            edge[i].next_edge=head[x];
            edge[i].v=y;
            edge[i].t=1;
            edge[i].val = z;
            head[x]=i;

            edge[i+m].next_edge=head[y];
            edge[i+m].v=x;
            edge[i+m].t=1;
            edge[i+ m].val = z;
            head[y]=i+m;
        }
        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
*/


版权声明:欢迎在小站搜索磁力内容:bt书虫 www.btbook.top 千万级磁力存储,分布式爬虫。全国高校IT精英群号:467123855

Uva - 1599 - Ideal Path

先倒着BFS,找到每个结点i到重点最短距离d[i],然后直接起点开始BFS,如果有多种走法,选颜色字典序最小的走。 AC代码: #include #include #include #inc...
  • zyq522376829
  • 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
  • a197p
  • 2015年03月16日 09:01
  • 879

UVa 1599 - Ideal Path <两次BFS>

两个月前就搞这道题,昨天翻出来直接修改的当时的超时代码,经历了多种错误,最后终于还是AC了。 这道题还是挺好的一道题,需要正反两次BFS,需要加各种防超时的判断。实际上还是考差对问题的理解,什么时候...
  • kun768
  • kun768
  • 2015年02月03日 15:05
  • 986

UVA - 1599 Ideal Path

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

例题6-20 理想路径 UVa1599

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

uva 1599 - Ideal Path

#include #include #include #include #include #include #include #include #include #include ...
  • u010652938
  • 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
  • c21c21
  • 2015年03月24日 21:01
  • 205

Ideal Path UVA - 1599

仿照刘汝佳的代码用vector却超时。。。 只能自己再写一个用队列实现的。。 而且还要注意这个地方要vis数组。。(按理说应该知道走过的路自然不会再走啊。。   不懂。。。。) ...
  • now_ing
  • now_ing
  • 2017年04月11日 10:17
  • 64

UVA 1599 Ideal Path 【两次BFS+贪心】 (好题)

题目链接题意迷宫中有n个房间,m条路,每条路上都涂上了颜色(用整数表示),求按走的路径的颜色排列的字典序最小的最短路分析贪心方法求最短路当然简单,每条路的长度都是1,BFS、SPFA、Dijkstra...
  • DrCarl
  • DrCarl
  • 2016年07月24日 22:20
  • 165

UVA 1599 Ideal Path

题目大意就是给一个包含n个点(编号1~n)m条边的无向图,每条边有一个附加属性颜色,但是长度为1,求从起点(编号为1)走到终点(编号为n)的最短路。而且最短路应该满足边的颜色的字典序最小。     ...
  • qq_33382034
  • qq_33382034
  • 2016年08月06日 19:01
  • 145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 1599 Ideal Path
举报原因:
原因补充:

(最多只允许输入30个字)