2020年团体程序设计天梯赛 L2-4 网红点打卡攻略

思路:

水题,略过

Tip:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 200 + 5;
const int INF = 0x7FFFFFFF;

int mp[maxn][maxn];

int len[maxn];
int minn = INF;
int indexx = 0;

int main() {
    memset(mp, 0x3f, sizeof(mp));
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        if (mp[x][y] > z)
            mp[x][y] = z;
        if (mp[y][x] > z)
            mp[y][x] = z;
    }
    int q;
    cin >> q;
    int num = 0;
    for (int nowidnex = 1; nowidnex <= q; nowidnex++) {
        int k;
        set<int> s;
        cin >> k;
        for (int i = 1; i <= k; i++) {
            cin >> len[i];
            s.insert(len[i]);
        }
        if (k != n || s.size() != n || mp[0][len[1]] == 0x3f3f3f3f || mp[len[k]][0] == 0x3f3f3f3f)
            continue;
        int ans = mp[0][len[1]] + mp[len[k]][0];
        bool flag = true;
        for (int i = 1; i < k; i++) {
            if (mp[len[i]][len[i + 1]] == 0x3f3f3f3f) {
                flag = false;
                break;
            }
            ans += mp[len[i]][len[i + 1]];
        }
        if (!flag)
            continue;
        if (ans < minn) {
            minn = ans;
            indexx = nowidnex;
        }
        num++;
    }
    cout << num << endl;
    cout << indexx << " " << minn << endl;
    return 0;
}

  

原文地址:https://www.cnblogs.com/Whiteying/p/14056514.html