emmm考试的时候
以为是个图
果断放弃
其实就是道模拟题
还是太菜了
看懂题意先
先找出输出的四种情况
根据样例来判断
①如果有相连的路不连通,不是环且输出NA
②如果首尾不相同或者并没有经过每一个点(可以用set存储,相同的直接去掉,然后set容器的size如果不等于给出的值的个数)
不是环
【注意】
set的作用:自动去重且按升序排序
③遍历了的数的个数如果超过或小于给出数的存量+1,就不是简单环
④剩下的就是简单环
【注意】
vector容器大小的存储
vector<int>v(size)
#include<bits/stdc++.h>
using namespace std;
#define maxn 300
int e[maxn][maxn];
int ans=999999;
int cnt;
int m,n;
void check(int index)
{
int t;
scanf("%d",&t);
set<int>s;
vector<int>v(t);
for(int i=0;i<t;i++)
{
scanf("%d",&v[i]);
s.insert(v[i]);
}
bool flag=true;
int sum=0;
for(int i=0;i<t-1;i++)
{
if(e[v[i]][v[i+1]]==0)
{
flag=false;
}
sum+=e[v[i]][v[i+1]];
}
if(flag==false)
printf("Path %d: NA (Not a TS cycle)\n",index);
else if(v[0]!=v[t-1]||s.size()!=m)
printf("Path %d: %d (Not a TS cycle)\n",index,sum);
else if(t==m+1)
{
printf("Path %d: %d (TS simple cycle)\n",index,sum);
if(sum<ans)
{
ans=sum;
cnt=index;
}
}
else
{
printf("Path %d: %d (TS cycle)\n",index,sum);
if(sum<ans)
{
ans=sum;
cnt=index;
}
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++)
{
int a,b,dis;
scanf("%d%d%d",&a,&b,&dis);
e[a][b]=dis;
e[b][a]=dis;
}
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
check(i);
}
printf("Shortest Dist(%d) = %d\n",cnt,ans);
return 0;
}