Skip to content

dfs

原始文件为 cpp 代码,本文是转换后的 Markdown 文件。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <math.h>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

// true == <
bool compare(vector<int>& a, vector<int>& b)
{
    int a_size = a.size();
    int b_size = b.size();
    if(a_size < b_size) return true;
    else if(a_size > b_size) return false;

    for(int i = 0; i < a_size; ++i)
    {
        if(a[i] < b[i]) return true;
        if(a[i] > b[i]) return false;
    }
    return true;
}

vector<int> G[100005];
vector<int> E[100005];
bool vis[100005];

vector<int> best_res;
int best_len;
int n, m; 

void dfs(int cur_node, int cur_len, vector<int>& cur_res);
int main()
{
    // freopen("IDEALPATH.txt", "r", stdin);
    while(scanf("%d%d", &n, &m) != EOF)
    {
        memset(vis, false, sizeof(vis));
        best_len = n + 5;
        best_res.clear();

        for(int i = 0; i < 100005; ++i) G[i].clear();
        for(int i = 0; i < 100005; ++i) E[i].clear();

        for(int i = 0; i < m; ++i)
        {
            int u, v, c;
            scanf("%d%d%d", &u, &v, &c);
            G[u].push_back(v);
            G[v].push_back(u);
            E[u].push_back(c);
            E[v].push_back(c);
        }
        vector<int> result;
        vis[1] = true;
        dfs(1, 0, result);

        printf("%d\n", best_len);

        int size = best_res.size();
        if(size > 0) printf("%d", best_res[0]);
        for(int i = 1; i < size; ++i) printf(" %d", best_res[i]);
        printf("\n");
    }
}

void dfs(int cur_node, int cur_len, vector<int>& cur_res)
{
    // printf("dfs(%d, %d)\n", cur_node, cur_len);
    if(cur_len > best_len) return;

    if(cur_node == n)
    {
        if(cur_len < best_len || compare(cur_res, best_res))
        {
            best_len = cur_len;
            best_res = cur_res;
        }
        return;
    }

    int size = G[cur_node].size();
    for(int i = 0; i < size; ++i)
    {
        int v = G[cur_node][i];

        if(vis[v]) continue;
        vis[v] = true;
        cur_res.push_back(E[cur_node][i]);

        // printf("vis[1] = %d\n", vis[1]);
        // printf("i = %d , dfs(%d, %d) --- dfs(%d, %d)\n", i, cur_node, cur_len, v, cur_len + 1);
        dfs(v, cur_len+1, cur_res);
        vis[v] = false;
        cur_res.pop_back();
    }
}