L2-036 网红点打卡攻略

#include <bits/stdc++.h>

using namespace std;

const int N = 210;
int w[N][N];

int main() {
    int n, m;
    cin >> n >> m;
    memset(w, -1, sizeof w);
    while (m--) {
        int a, b, c;
        cin >> a >> b >> c;
        w[a][b] = w[b][a] = c;
    }
    int k;
    cin >> k;
    vector<pair<int, int>> legal;
    int cost = 1e9;
    for (int i = 1; i <= k; i++) {
        int qr;
        cin >> qr;
        //cout << "qr = " << " ";
        vector<int> v(qr + 2, 0);
        bool ok = 1;
        int res = 0;
        set<int> S;
        for (int u = 1; u <= qr; u++) {
            int x;
            cin >> x;
            S.insert(x);
            //cout << "x == " << x << " ";
            if (w[v[u - 1]][x] == -1) {
                ok = false;
            }
            res += w[v[u - 1]][x];
            v[u] = x;
        }
        if (S.size() != n) ok = false;
        if (qr != n) ok = false;
        if (w[v[qr]][0] == -1) ok = false;
        if (!ok) continue;
        res += w[v[qr]][0];
        cost = min(cost, res);
        legal.push_back({res, i});
    }

    cout << legal.size() << endl;
    for (int i = 0; i < legal.size(); i++) {
        if (legal[i].first == cost) {
            cout << legal[i].second << " " << cost << "\n";
            break;
        }
    }

    return 0;
}
posted @ 2022-04-16 15:17  Xxaj5  阅读(71)  评论(0编辑  收藏  举报