题意:构造一颗无向图,给出几条路径,判断是否是回路,是否是简单回路,求最小的路径id和最短的回路
思路:用邻接矩阵保存图,然后对每条路进行判断,逻辑一定要理解清楚,不然逻辑会混乱
注意点:1.相邻两个节点无路;2.没有访问到所有的节点,这里用一个set集合保存所有访问不相同的节点个数;3.第一个节点与最后一个节点不相等;这三种情况都是打印无回路,然后就是简单回路,简单回路是访问所有节点除了第一个几点以外只访问一遍,剩下一种情况就是节点不止访问一次
最好写函数,都写到主函数真的臃肿,像一坨~,
代码:
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
int graph[300][300];
using namespace std;
int n = 0, m = 0, k = 0, ans = 99999999, ansid = 0;
void check(int num) {
set<int> s;
int sum = 0,v = 0,flag = 1;
cin >> v;
vector<int> p(v);
for (int j = 0; j < v; j++) {
scanf("%d", &p[j]);
s.insert(p[j]);
}
for (int j = 0; j < p.size() - 1; j++) {
sum += graph[p[j]][p[j + 1]];
if (graph[p[j]][p[j + 1]] == 0) {
flag = 0;
break;
}
}
if (flag == 0) {
printf("Path %d: NA (Not a TS cycle)\n",num);
}
else if (p[0] != p[p.size() - 1] || s.size() < n) {
printf("Path %d: %d (Not a TS cycle)\n", num, sum);
}
else if (p.size() - 1 == n) {
printf("Path %d: %d (TS simple cycle)\n", num, sum);
if (sum < ans) {
ans = sum;
ansid = num;
}
}else{
printf("Path %d: %d (TS cycle)\n", num, sum);
if (sum < ans) {
ans = sum;
ansid = num;
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {//构造图
int x = 0, y = 0, z = 0;
scanf("%d%d%d",&x,&y,&z);
graph[x][y] = graph[y][x] = z;
}
cin >> k;
for (int i = 1; i <= k; i++) {
check(i);
}
printf("Shortest Dist(%d) = %d\n",ansid,ans);
system("pause");
return 0;
}