A1150
个人思路
题意
给出图的遍历路径,判断该路径是否是旅行商路径,若是则继续判断是否简单旅行商路径(除源点外,每个顶点只访问一次)
思路
- 无效路径:路径中两点之间不存在边
- 不是旅行商路径:序列起点终点不同 || 序列顶点个数不足N + 1个(两次访问源点)
- 普通旅行商路径:除了源点之外,多次访问其他顶点
- 简单旅行商路径:除了源点之外,其他路径均访问了一次
注意
- 一开始if判断条件存在问题,n与N+1是相等和不等的关系,而不是大小的关系;而且使用if,else if,最后没有else,导致一个测试点都没有通过
if(dist == -1)
{
printf("Path %d: NA (Not a TS cycle)\n", k);
}
else if(cnt < N || flag == -1)//没有遍历完所有城市
{
printf("Path %d: %d (Not a TS cycle)\n", k, dist);
}
else if(cnt == N && n > N + 1)//遍历了所有城市,有的城市不止一次访问
{//判断条件错误!!!!
printf("Path %d: %d (TS cycle)\n", k, dist);
if(dist < ans)
{
ans = dist;
ansindex = k;
}
}
else if(cnt == N && K == N + 1)//错误!!!!!
{
printf("Path %d: %d (TS simple cycle)\n", k, dist);
if(dist < ans)
{
ans = dist;
ansindex = k;
}
}
AC代码
#include <bits/stdc++.h>
using namespace std;
int N, M, K;
int G[210][210];
bool vis[210];
int main(int argc, char *argv[]) {
scanf("%d%d", &N, &M);
for(int i = 0; i < M; ++i)
{
int u, v, d;
scanf("%d%d%d", &u, &v, &d);
G[u][v] = G[v][u] = d;
}
scanf("%d", &K);
int ans = 0x3fffffff, ansindex = 0;
for(int k = 1; k <= K; ++k)
{
int n, fir;
scanf("%d", &n);
vector<int> sub;
memset(vis, false, sizeof(vis));
int flag = 0;//-1:not a ts cycle;
for(int i = 0; i < n; ++i)
{
int x;
scanf("%d", &x);
sub.push_back(x);
}
//不能回到起始点,不能遍历所有点并回到起始点
if(sub[0] != sub[sub.size() - 1] || sub.size() < N + 1)
{
flag = -1;
}
//此时说明是环路且可能遍历所有城市
//dist:-1表示无解,cnt记录经过的顶点数
int dist = 0, cnt = 0;
for(int i = 0; i < n - 1; ++i)
{
if(dist == -1)
continue;
int u = sub[i];
int v = sub[i + 1];
if(vis[u] == false)
{
vis[u] = true;
cnt++;
}
if(vis[v] == false)
{
vis[v] = true;
cnt++;
}
if(G[u][v] == 0)//两个城市之间不存在边
{
dist = -1;
flag = -1;
}
else
{
dist += G[u][v];
}
}
if(dist == -1)
{
printf("Path %d: NA (Not a TS cycle)\n", k);
}
else if(cnt < N || flag == -1)//没有遍历完所有城市
{
printf("Path %d: %d (Not a TS cycle)\n", k, dist);
}
else if(cnt == N && n != N + 1)//遍历了所有城市,有的城市不止一次访问
{
printf("Path %d: %d (TS cycle)\n", k, dist);
if(dist < ans)
{
ans = dist;
ansindex = k;
}
}
else
{
printf("Path %d: %d (TS simple cycle)\n", k, dist);
if(dist < ans)
{
ans = dist;
ansindex = k;
}
}
}
printf("Shortest Dist(%d) = %d\n", ansindex, ans);
return 0;
}