欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ideal Path UVA - 1599

程序员文章站 2022-06-03 18:25:50
...

    这道题的坑是在普通BFS的基础上要查看最小权值。但是我一开始想着先用最普通的bfs来写,只是在初始化时做了一个权值的排序,然而并没有什么用,因为有可能:

Ideal Path UVA - 1599

但是一开始压进去的是b,它先找到e,所以这显然是错误的,所以应该转换一下思路,我们是因为不知道在第n层的最小权值应该是多少,才陷入困境,但是前提又是最短路,所以先从最后一个点开始bfs,其实这个思想是迪杰特斯特拉吧哈哈哈。然后我就醍醐灌顶了!既然都知道下一个点应该是什么,就找到那个有最小权值的点,压进去就好了。

#include <iostream>
#include <bits/stdc++.h>
#define maxn 100000+10
#define inf 0x3f3f3f
using namespace std;
int n,m;
vector<int>g[maxn];//点
vector<int>c[maxn];//颜色
int d[maxn];
int ans[maxn];//放置每一条上最小的颜色
bool vis[maxn];

void bfs1(int u)
{
    queue<int>q;
    q.push(u);
    vis[u] = 1;
    while(!q.empty())
    {
        int v = q.front();q.pop();
        if(v == 1) return;
        for(int i = 0;i<g[v].size();i++)
        {
            int w = g[v][i];
            if(!vis[w])
            {
                vis[w] = 1;
                d[w] = d[v]+1;
                q.push(w);
            }
        }
    }
}

void bfs2()
{
    queue<int>q;
    memset(vis,0,sizeof(vis));
    q.push(1);
    while(!q.empty())
    {
        int v = q.front();q.pop();
        if(v == n) return;
        for(int i = 0;i<g[v].size();i++)
        {
            int w = g[v][i];
            if(d[w] == d[v]-1)
            {
                ans[d[v]] = min(ans[d[v]],c[v][i]);
            }
        }
        for(int i = 0;i<g[v].size();i++)
        {
            int w = g[v][i];
            if(d[w] == d[v]-1 && c[v][i]==ans[d[v]] && !vis[w])
            {
                vis[w] = 1;
                q.push(w);
            }
        }
    }
}

int main()
{
    int a,b,k;
    while(cin>>n>>m)
    {
        memset(d,0,sizeof(d));
        memset(vis,0,sizeof(vis));
        memset(ans,inf,sizeof(ans));
        for(int i = 1;i<=n;i++)
        {
            g[i].clear();
            c[i].clear();
        }
        for(int i = 0;i<m;i++)
        {
            cin>>a>>b>>k;
            g[a].push_back(b);
            g[b].push_back(a);
            c[a].push_back(k);
            c[b].push_back(k);
        }
        bfs1(n);
        bfs2();
        cout<<d[1]<<endl;
        cout<<ans[d[1]];
        for(int i = d[1]-1;i>0;i--)
            cout<<" "<<ans[i];
        cout<<endl;
    }
    return 0;
}
/**
4 6
1 2 1
1 3 2
3 4 3
2 3 1
2 4 4
3 1 1
**/