题目详情 - L2-036 网红点打卡攻略 (pintia.cn)
先判断攻略的个数是否与网红点数相同,然后判断攻略的点是否有重复,最后计算合法的攻略距离并取最小
#include<iostream>
#include<vector>
#include<cstring>
#include<set>
using namespace std;
const int N = 210,INF = 0x3f3f3f3f;
int n,m,idx,res = INF;
int g[N][N];
bool book[N];
bool check(vector<int> &gl,int id){
if(gl.size() != n) return false;
memset(book,0,sizeof book);
for(int i = 1; i < gl.size(); i++){
if(book[gl[i]]) return false;
else book[gl[i]] = true;
}
int now = 0, sum = 0;
for(auto num:gl){
if(g[now][num] == INF) return false;
sum += g[now][num];
now = num;
}
if(g[now][0] == INF) return false;
sum += g[now][0];
if(res > sum) {
res = sum;
idx = id;
}
return true;
}
int main(){
cin>>n>>m;
memset(g,0x3f,sizeof g);
while(m--){
int u,v,w;
cin>>u>>v>>w;
g[u][v] = g[v][u] = w;
}
int cnt = 0;
vector<int> gl;
int k; cin>>k;
for(int i = 1; i <= k; i++){
int q; cin>>q;
gl.clear();
for(int i = 0; i < q; i++){
int x; cin>>x;
gl.push_back(x);
}
if(check(gl,i)) cnt++;
}
cout<<cnt<<endl<<idx<<' '<<res;
return 0;
}