例题 6-20 UVA - 1599Ideal Path

Posted Visitor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了例题 6-20 UVA - 1599Ideal Path相关的知识,希望对你有一定的参考价值。

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


逆向做一遍bfs.
得到终点到某个点的最短距离。
这样,我们从起点顺序的时候。
就能知道最短路的下一步是要走哪里了。
这样,我们从起点也开始做一遍bfs.
然后根据逆序的bfs得知下一步该往哪些点走。
每次优先走最小的字典序边即可。
多个最小的,就每个都走一遍试试。
6 6
1 2 3
1 3 3
2 4 5
3 5 1
4 6 1
5 6 100
↑↑这组数据可以hack网上好多人(>=1)的做法。
如果出现前一段路不是最小字典序了,就要结束这一段路了,不能继续往下走。

【代码】

/*
    1.Shoud it use long long ?
    2.Have you ever test several sample(at least therr) yourself?
    3.Can you promise that the solution is right? At least,the main ideal
    4.use the puts("") or putchar() or printf and such things?
    5.init the used array or any value?
    6.use error MAX_VALUE?
*/
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5;

int n,m,dis[N+10];
bool vis[N+10];
vector < pair<int,int> > g[N+100];  
queue <int> dl;
int a[N+10];

int main(){
    #ifdef LOCAL_DEFINE
        freopen("F:\\c++source\\rush_in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0),cin.tie(0);
    
    while (cin >> n >> m){
        memset(vis,0,sizeof vis);
        for (int i = 1;i <= n;i++) a[i] = (int) 1e9+7;
        for (int i = 1;i <= n;i++) g[i].clear();
        for (int i = 1;i <= m;i++){
            int x,y,z;
            cin >>x>>y>>z;
            g[x].push_back(make_pair(y,z));
            g[y].push_back(make_pair(x,z));
        }

        memset(dis,255,sizeof dis);
        dis[n] = 0;
        dl.push(n);
        while (!dl.empty()){
            int x = dl.front();
            dl.pop();
            for (int i = 0;i < (int)g[x].size();i++){
                int y = g[x][i].first;
                if (dis[y]==-1){
                    dis[y] = dis[x] + 1;
                    dl.push(y);
                }
            }
        }

        vis[1] = true;
        dl.push(1);
        while (!dl.empty()){
            int x = dl.front();
            dl.pop();
            int mi = (int) 1e9 + 10;
            for (int i = 0;i < (int) g[x].size();i++){
                int y = g[x][i].first;
                if (dis[y]==dis[x]-1){
                    mi = min(mi,g[x][i].second);                    
                }
            }
            
            a[dis[x]] = min(mi,a[dis[x]]);
            for (int i = 0;i < (int) g[x].size();i++){
                int y = g[x][i].first;
                if (!vis[y] && dis[y]==dis[x]-1 && g[x][i].second==mi){
                    vis[y] = true;
                    dl.push(y);         
                }
            }
        }

        cout << dis[1] << endl;
        for (int i = dis[1];i >= 1;i--) {
            cout << a[i];
            if (i==1) cout << endl;else cout << ' ';
        }
    }


    return 0;
}

以上是关于例题 6-20 UVA - 1599Ideal Path的主要内容,如果未能解决你的问题,请参考以下文章

UVA 1599 Ideal Path

[UVA 1599] Ideal Path | 细节最短路

UVA 1599 Ideal Path

UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

每日一题 UVA - 1599 Ideal Path 字典序最短路

BFS最短路径还原+字典序UVA 1599 Ideal Path 和 UPC 4431香港记者