题目
思路
水题
代码
#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;
}