有个3分的测试点过不去,很烦。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, m;
int v[300][300] = {0};
int minn = 999999999;
int x;
scanf("%d %d", &n, &m);
int a, b, dis;
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &a, &b, &dis);
v[a][b] = v[b][a] = dis;
}
int k, num, p;
vector<int> path;
scanf("%d", &k);
for (int i = 0; i < k; i++)
{
cin >> num;
int sum = 0;
int cnt = 0;
path.clear();
for (int j = 0; j < num; j++)
{
cin >> p;
path.push_back(p);
}
for (int j = 0; j < path.size() - 1; j++)
{
if (v[path[j]][path[j + 1]] > 0)
{
sum += v[path[j]][path[j + 1]];
cnt++;
}
}
if (cnt < num - 1) printf("Path %d: NA (Not a TS cycle)\n", i + 1);
else if (num < n + 1) printf("Path %d: %d (Not a TS cycle)\n", i + 1, sum);
else if (num == n + 1 && path.front() != path.back()) printf("Path %d: %d (Not a TS cycle)\n", i + 1, sum);
else if (num == n + 1 && path.front() == path.back())
{
if (sum < minn)
{
minn = sum;
x = i + 1;
}
printf("Path %d: %d (TS simple cycle)\n", i + 1, sum);
}
else if (num > n + 1 && path.front() == path.back())
{
if (sum < minn)
{
minn = sum;
x = i + 1;
}
printf("Path %d: %d (TS cycle)\n", i + 1, sum);
}
}
printf("Shortest Dist(%d) = %d", x, minn);
}
本文介绍了一个使用C++实现的图遍历算法,通过输入顶点数、边数及路径数,计算并输出每条路径的总距离。特别关注于判断路径是否构成环,并找出所有构成环的路径中最短的那个。此算法适用于解决旅行商问题等最短路径问题。

230

被折叠的 条评论
为什么被折叠?



