版本2
1.TS simple cycle
2.TS cycle
3.Not a TS cycle
首先在读入查询节点集合的过程中计算路径总长,用一个变量flag3来保存,是否有路径不存在边,同时保存总结点数。如果节点数小于n则说明有的顶点没有经过。所以明显这不是TS环。
另外,如果有断边,说明也不是TS环。
接着判断最初点和最末点是否相同,并且统计每个顶点出现的次数,如果每个顶点出现的次数全部刚好一次,则说明是简单环。
如果首末点相同,且每个顶点出现的次数超过一次,则说明不是简单环。
如果首末点不同,则说明不是TS环。
#include <cstdio>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
#include <map>
using namespace std;
const int N = 205;
int G[N][N];
int arr[N];
int in[N];
int n;
int main(){
int m, u, v, w, x;
scanf("%d %d", &n, &m);
memset(G, 0, sizeof G);
while(m--){
scanf("%d%d%d", &u, &v, &w);
G[u][v] = w;
G[v][u] = w;
}
int t, k;
scanf("%d", &t);
int opt = 0x3f3f3f3f, optv;
for(int z = 1; z <= t; z++){
scanf("%d", &k);
memset(in, 0, sizeof in); //初始化
int dist = 0;
bool flag3 = false;
unordered_set<int> sst;
for(int i = 0; i < k; i++){
scanf("%d", &arr[i]);
in[arr[i]]++;
sst.insert(arr[i]);
if(i){
if(G[arr[i-1]][arr[i]] != 0){
dist += G[arr[i-1]][arr[i]];
}else flag3 = true; //有路径不存在
}
}
if(sst.size() != n){ //不是环
if(flag3)
printf("Path %d: NA (Not a TS cycle)\n", z);
else
printf("Path %d: %d (Not a TS cycle)\n", z,dist);
continue;
} else if(flag3) {
printf("Path %d: NA (Not a TS cycle)\n", z);
continue;
}
if(dist < opt){
opt = dist;
optv = z;
}
bool onetime = true;
for(int i = 1; i <= n; i++){
if(arr[0] == i) continue;
if(in[i] > 1) onetime = false;
}
if(arr[0] == arr[k-1] && onetime) {
printf("Path %d: %d (TS simple cycle)\n", z,dist);
}else if(arr[0] == arr[k-1] && !onetime) printf("Path %d: %d (TS cycle)\n", z,dist);
else printf("Path %d: %d (Not a TS cycle)\n", z,dist);
}
printf("Shortest Dist(%d) = %d\n",optv, opt);
return 0;
}
版本1
很繁琐的题目,难其实不难。
#include<bits/stdc++.h>
using namespace std;
const int maxn=205;
const int INF = 0x3fffffff;
int G[maxn][maxn];
int in[maxn],arr[maxn];
int opti=0,optd=INF;
int main(){
int n,m,u,v,d;
fill(G[0],G[0]+maxn*maxn,INF);
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&d);
G[u][v]=d;
G[v][u]=d;
}
int k,t,x;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d",&t);
int flag=0,last,tag=0,na=0,label=0,sum=0;
memset(in,0,sizeof(in));
for(int j=0;j<t;j++){
scanf("%d",&x);
if(j!=0 &&G[last][x]!=INF) sum+=G[last][x];
if(j!=0 &&G[last][x]==INF) na=1;
last=x;
arr[j]=x;
in[x]++;
}
for(int j=1;j<=n;j++){
if(j!=last && in[j]!=1){
label=1;
break;
}
}
for(int j=1;j<=n;j++){
if(in[j]<1){
tag=1;
break;
}
}
if(arr[0]==arr[t-1]&&label==0&&na==0){
printf("Path %d: %d (TS simple cycle)\n",i+1,sum);
if(sum < optd){
optd= sum;
opti = i+1;
}
}else if(in[arr[0]]>=2 && tag==0&&na==0){
printf("Path %d: %d (TS cycle)\n",i+1,sum);
if(sum < optd){
optd= sum;
opti = i+1;
}
}else{
if(na==1)
printf("Path %d: NA (Not a TS cycle)\n",i+1);
else
printf("Path %d: %d (Not a TS cycle)\n",i+1,sum);
}
}
printf("Shortest Dist(%d) = %d\n",opti,optd);
return 0;
}