1150 Travelling Salesman Problem (25分)

1150 Travelling Salesman Problem (25分)

題目要求

旅行商問題
給定路徑
判斷是否爲旅行商路徑、旅行商簡單路徑、非旅行商路徑
最後輸出最短旅行商路徑

解題思想

isConnect判斷是否存在路徑
isTS判斷是否爲旅行商路徑
isSimple判斷是否爲簡單旅行商路徑

AC代碼

#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int n, m;
int dis[220][220];
int main(){
    scanf("%d%d", &n, &m);
    int a, b, d, k, v, pre, cur, head, minp = inf, mind = inf;
    for (int i = 0; i < m; i++){
        scanf("%d%d%d", &a, &b, &d);
        dis[a][b] = dis[b][a] = d;
    }
    scanf("%d", &k);
    for (int p = 1; p <= k; p++){
        int have[220], isConnect = 1, tot = 0, isTS = 1;
        memset(have, 0, sizeof(have));
        scanf("%d%d", &v, &head);
        have[head] += 1;
        pre = head;
        for (int i = 1; i < v; i++){
            scanf("%d", &cur);
            if (i == v-1 && cur != head) isTS = 0;
            if (dis[pre][cur]){
                tot += dis[pre][cur];
                have[cur] += 1;
                pre = cur;
            }
            else isConnect = 0;
        }
        if (isConnect){
            int isSimple = 1;
            for (int i = 1; i <= n; i++){
                if (!have[i]) isTS = 0;
                if ((i != head && have[i] > 1) || (i == head && have[i] > 2)) isSimple = 0;
            }
            if (isTS){
                if (tot < mind){
                    mind = tot;
                    minp = p;
                }
                if (isSimple) printf("Path %d: %d (TS simple cycle)\n", p, tot);
                else printf("Path %d: %d (TS cycle)\n", p, tot);
            }
            else printf("Path %d: %d (Not a TS cycle)\n", p, tot);
        }
        else printf("Path %d: NA (Not a TS cycle)\n", p);
    }
    printf("Shortest Dist(%d) = %d", minp, mind);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章