dfs直接求解,注意处理一下超时就行,时间好像有点慢,243ms运行完

#include <climits>
#include <iostream>
#include <vector>
using namespace std;

struct Edge {
    int to;
    int time;
    Edge(int to, int time): to(to), time(time) {}
};
vector<Edge> graph[601];
int nationality[601];
int visited[601] = {0};
int n, m;
int res;

void dfs(int cur, int time, int change) {
    //到达终点
    if (cur == 2 && change <= 1) {
        res = min(res, time);
        return ;
    }
    //非法
    if (change > 1)
        return ;
    if(time >res)
        return ;
        
    for (auto x : graph[cur]) {
        if (!visited[x.to]) {
            visited[x.to] = 1;
            nationality[cur] == nationality[x.to] ? dfs(x.to, time + x.time,
                    change) : dfs(x.to, time + x.time, change + 1);
            visited[x.to] = 0;
        }
    }
}

int main() {
    while (cin >> n) {
        if (n == 0) break;
        cin >> m;
        for (int i = 0; i < m; i++) {
            int x, y, t;
            cin >> x >> y >> t;
            graph[x].emplace_back(y, t);
            graph[y].emplace_back(x, t);
        }
        for (int i = 1; i <= n; i++) {
            cin >> nationality[i];
            visited[i] = 0;
        }

        visited[1] = 1;
        res = INT_MAX;
        dfs(1, 0, 0);
        if (res != INT_MAX)
            cout << res << endl;
        else
            cout << "-1" << endl;
        //清理脏数据
        for (int i = 1; i <= n; i++)
            graph[i].clear();
    }
}