题意:
给定一个无向图,
然后分别给m个查询,每个查询都是一个点集,问这个点集的类型
思路:
首先分两种:1.是TS,2.不是TS
是TS的:按照是不是每个点都经过一次,分为是不是简单TS
不是TS的:可能是给定的点集不能构成通路,那路径长度为NA,其余不和题目要求的照常算路径长度
#include<bits/stdc++.h>
#include<cstring>
#define FI first
#define SE second
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 200 + 7;
const int maxd = 2e4 + 77;
const int INF = 0x7f7f7f7f;
int n, m, q;
int d[maxn][maxn];
int id, ans = INF;
int cnt, a[maxn];
set<int> st;
bool ok(int &tmp) {
bool res = true;
if(a[1] != a[cnt]) res = false;
if(st.size() != n) res = false;
tmp = 0;
for(int i = 2; i <= cnt; ++i) {
if(d[a[i]][a[i-1]] == -1) {
tmp = -1;
res = false;
return res;
}
else {
tmp += d[a[i]][a[i-1]];
}
}
return res;
}
void solve(int cs) {
int t = 0;
scanf("%d", &cnt);
st.clear();
for(int i = 1; i <= cnt; ++i) {
scanf("%d", &a[i]);
st.insert(a[i]);
}
int tmp;
if(!ok(tmp)) {
if(tmp == -1) {
printf("Path %d: NA (Not a TS cycle)\n", cs);
}
else {
printf("Path %d: %d (Not a TS cycle)\n", cs, tmp);
}
}
else {
if(cnt - st.size() == 1) {
printf("Path %d: %d (TS simple cycle)\n", cs, tmp);
}
else {
printf("Path %d: %d (TS cycle)\n", cs, tmp);
}
if(tmp < ans) {
ans = tmp;
id = cs;
}
}
}
int main() {
memset(d, -1, sizeof d);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i) {
int u, v;
scanf("%d%d", &u, &v);
scanf("%d", &d[u][v]);
d[v][u] = d[u][v];
}
scanf("%d", &q);
for(int i = 1; i <= q; ++i) {
solve(i);
}
printf("Shortest Dist(%d) = %d", id, ans);
return 0;
}