PTA甲級考試真題練習150——1150 Travelling Salesman Problem

題目

在這裏插入圖片描述

思路

水題

代碼

#include <iostream>
#include <vector>
#include<math.h>
using namespace std;
const int nmax = 210;
int graph[nmax][nmax];
int n, m;
int mark[nmax] = { 0 };
int query(const vector<int>& vec,int& dist) {
	bool m = true;
	for (int i = 0; i < vec.size() - 1; ++i) {
		int u = vec[i], v = vec[i + 1];
		if (mark[u])
			m = false;
		mark[u]++;
		if (graph[u][v] != inf) {
			dist += graph[u][v];
		}
		else {
			dist = -1;
			return 0;
		}
	}
	mark[vec[vec.size() - 1]]++;
	for (int i = 1; i <= n; ++i) {
		if ((i == vec[0] && mark[i] == 1) || (mark[i] == 0))
			return 0;
	}
	if (!m)
		return 1;
	else
		return 2;
}

int main()
{
	cin >> n >> m;
	fill(graph[0], graph[0] + nmax * nmax, inf);
	for (int i = 0; i < m; ++i) {
		int u, v,w;
		cin >> u >> v >> w;
		graph[u][v] = graph[v][u] = w;
	}
	int qn;
	cin >> qn;
	int min_dist = inf;
	int min_index = -1;
	for (int i = 1; i <= qn; ++i) {
		int num;
		cin >> num;
		vector<int> vec;
		vec.resize(num);
		for (int j = 0; j < num; ++j) cin >> vec[j];
		int dist = 0;
		int res = query(vec,dist);
		if (res != 0) {
			if (min_dist > dist) {
				min_dist = dist;
				min_index = i;
			}
		}
		switch (res)
		{
		case 0:
			dist == -1 ? cout << "Path " << i << ": NA (Not a TS cycle)"<<endl : cout << "Path " << i << ": " << dist << " (Not a TS cycle)"<<endl;
			break;
		case 1:
			cout << "Path " << i << ": " << dist << " (TS cycle)" << endl;
			break;
		case 2:
			cout << "Path " << i << ": " << dist << " (TS simple cycle)" << endl;
		}
		memset(mark, 0, sizeof(mark));
	}
	cout << "Shortest Dist("<<min_index<<") = "<<min_dist;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章