⬆︎
×

[PAT-A] 1150 Travelling Salesman Problem

Hyplus目录

Java

测试点3超时

import java.io.*;
import java.util.*;

public class Main {
    static final int N = 210, INF = 0x3f3f3f3f;
    static int n, m;
    static int[][] g = new int[N][N];

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter writer = new PrintWriter(System.out);

        String[] nm = reader.readLine().split(" ");
        n = Integer.parseInt(nm[0]);
        m = Integer.parseInt(nm[1]);

        for (int i = 1; i <= n; i++) {
            Arrays.fill(g[i], INF);
        }

        for (int i = 0; i < m; i++) {
            String[] edge = reader.readLine().split(" ");
            int a = Integer.parseInt(edge[0]);
            int b = Integer.parseInt(edge[1]);
            int w = Integer.parseInt(edge[2]);
            g[a][b] = g[b][a] = w;
        }

        int Q = Integer.parseInt(reader.readLine());

        int min = INF, minNum = 0;
        for (int num = 1; num <= Q; num++) {
            List<Integer> v = new ArrayList<>();
            Set<Integer> st = new HashSet<>();

            String[] path = reader.readLine().split(" ");
            int k = Integer.parseInt(path[0]);
            for (int i = 1; i <= k; i++) {
                int x = Integer.parseInt(path[i]);
                v.add(x);
                st.add(x);
            }

            int dist = 0;
            for (int i = 0; i < v.size() - 1; i++) {
                if (g[v.get(i)][v.get(i + 1)] == INF) {
                    dist = -1;
                    break;
                }
                dist += g[v.get(i)][v.get(i + 1)];
            }

            int flag = 2;
            if (st.size() < n || !v.get(0).equals(v.get(v.size() - 1)) || dist == -1)
                flag = 0;
            else if (v.size() != n + 1)
                flag = 1;

            if (flag != 0) {
                if (dist < min) {
                    min = dist;
                    minNum = num;
                }
            }

            writer.printf("Path %d: ", num);
            if (dist == -1) writer.print("NA ");
            else writer.print(dist + " ");

            if (flag == 2) writer.println("(TS simple cycle)");
            else if (flag == 1) writer.println("(TS cycle)");
            else writer.println("(Not a TS cycle)");
        }

        writer.printf("Shortest Dist(%d) = %d\n", minNum, min);
        writer.flush();
        writer.close();
        reader.close();
    }
}

C++

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <unordered_set>
#include <vector>

using namespace std;

const int N = 210, INF = 0x3f3f3f3f;

int n, m;
int g[N][N];

int main() {
    cin >> n >> m;

    for (int i = 0; i < m; ++i) {
        int a, b, w;
        cin >> a >> b >> w;
        g[a][b] = g[b][a] = w;
    }

    int Q;
    cin >> Q;

    int mind = INF, minnum = 0;
    for (int num = 1; num <= Q; ++num) {
        vector<int> v;
        unordered_set<int> st;

        int k;
        cin >> k;
        for (int i = 0; i < k; ++i) {
            int x;
            cin >> x;
            v.push_back(x);
            st.insert(x);
        }

        int dist = 0;
        for (int i = 0; i < v.size() - 1; ++i) {
            if (!g[v[i]][v[i + 1]]) {
                dist = -1;
                break;
            }

            dist += g[v[i]][v[i + 1]];
        }

        int flag = 2;
        if (st.size() < n || *v.begin() != *(v.end() - 1) || dist == -1)
            flag = 0;
        else if (v.size() != n + 1)
            flag = 1;

        if (flag) {
            if (dist < mind) {
                mind = dist;
                minnum = num;
            }
        }

        printf("Path %d: ", num);
        if (dist == -1) printf("NA ");
        else printf("%d ", dist);

        if (flag == 2) printf("(TS simple cycle)\n");
        else if (flag == 1) printf("(TS cycle)\n");
        else printf("(Not a TS cycle)\n");
    }

    printf("Shortest Dist(%d) = %d\n", minnum, mind);

    return 0;
}

发表评论