uva1599 Ideal path(未AC)

#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int>Pair;

const int maxn = 100000 + 3;
int n, m;
vector<Pair>G[maxn];


int d[maxn];
bool vis[maxn];

void  bfs1()
{
    memset(vis, 0, sizeof(vis));
    queue<int>q;
    q.push(n);
    vis[n] = true;
    d[n] = 0;
    while(!q.empty()){
        int u = q.front(); q.pop();
        if(u == 1){
            break;
        }
        for(int i = 0; i < G[u].size(); i++){
            int v = G[u][i].first;
            if(!vis[v]){
                q.push(v);
                vis[v] = true;
                d[v] = d[u] + 1;
            }
        }
    }
}

vector<int>best_colors;
void digui(int u, vector<int>cur_colors)
{
    int cur_d = d[u];
    if(u == n){
        for(int i = 0; i < d[1]; i++){
            if(cur_colors[i] < best_colors[i]){
                best_colors = cur_colors;
                break;
            }
        }
        return;
    }
    for(int i = 0; i < G[u].size(); i++){
        int v = G[u][i].first;
        if(d[v] == cur_d - 1){
            cur_colors.push_back(G[u][i].second);
            digui(v, cur_colors);
            cur_colors.pop_back();
        }
    }
}

void solve()
{
    memset(d, -1, sizeof(d));
    bfs1();
    for(int i = 0; i < d[1]; i++){
        best_colors.push_back(INT_MAX);
    }
    vector<int>cur_colors;
    digui(1, cur_colors);
    
    //输出
    cout << d[1] << endl;
    cout << best_colors[0];
    for(int i = 1; i < d[1]; i++)
        cout << " " << best_colors[i];
    cout <<endl;
}

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    while(cin >> n >> m && n){
        for(int i = 0; i < m; i++){
            int u, v, color;
            cin >> u >> v >> color;
            G[u].push_back(make_pair(v, color));
            G[v].push_back(make_pair(u, color));
        }
        solve();
    }
    return 0;
}

 

posted on 2019-02-26 21:32  nbsanshi  阅读(83)  评论(0编辑  收藏  举报

导航