题221.2022寒假天梯赛训练-7-10 网红点打卡攻略 (25 分)
一、题目
二、题解
1.注意攻略要求是从家到家,中途网红景点只能过一次,且每个网红景点都得去,所以重点得判断给定输入的始末点是否与家邻接,是否重复vis已经vis的点,vis的点数是否等于网红景点数。
2.满足要求的攻略去计算路上的总花费然后不断去更新作为结果的最小花费以及攻略编号就好
#include <bits/stdc++.h>
using namespace std;
const int Inf=0x3f3f3f3f;
int N,M;
int G[201][201];
int main()
{
fill(G[0],G[0]+201*201,Inf);
cin>>N>>M;
for(int i=0; i<M; i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u][v]=w;
G[v][u]=w;
}
int K;
cin>>K;
int num=0;
int minval=INT_MAX,res;
for(int i=1; i<=K; i++)
{
int n;
scanf("%d",&n);
int path[202],vis[201];
path[0]=0,path[n+1]=0;
fill(vis,vis+201,0);
int val=0;
int flag=1;
int j,count0=0;
for(j=1; j<=n; j++)
{
scanf("%d",&path[j]);
if(vis[path[j]])
{
flag=0;
}
else
{
vis[path[j]]=1;
count0++;
}
if(G[path[j-1]][path[j]]==Inf)
{
flag=0;
}
else
{
val+=G[path[j-1]][path[j]];
}
}
if(G[path[j-1]][path[j]]==Inf)
{
flag=0;
}
else
{
val+=G[path[j-1]][path[j]];
}
if(count0<N)
{
flag=0;
}
if(flag)
{
num++;
if(val<minval)
{
minval=val;
res=i;
}
}
}
cout<<num<<endl;
cout<<res<<" "<<minval;
}