诈骗题,模拟cos图论
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;cin>>n>>m;
vector<vector<int>>g(n+10,vector<int>(n+10,1e9));//初始定义为无限原
while(m--){
int u,v,val;cin>>u>>v>>val;
g[v][u]=val;g[u][v]=val;//无向图
}
int k;cin>>k;
vector<vector<int>>road;
int res=0;
for(int i=1;i<=k;i++){
map<int,int>mp;
vector<int>t(n+3);//多出了一个表示位置的值,依靠这个来排序,又多出了两个0代表家
int x;cin>>x;
int flag=1;
for(int j=2;j<=x+1;j++){
cin>>t[j];
mp[t[j]]++;
if(mp[t[j]]>1) flag=0;//不能存在重复元素
}
for(int j=2;j<=x+1;j++){
//cin>>t[j];
if(g[t[j]][t[j-1]]==1e9||g[t[j]][t[j+1]]==1e9){//判断是否有不可达的
flag=0;
}
}
if(x!=n) continue;
t[0]=i;
if(flag){
res++;//符合条件的路径
road.push_back(t);
}
}
int minx=2e9;
int pos=-1;
sort(road.begin(),road.end());//序号小的在前
for(int i=0;i<road.size();i++){
int sum=0;
for(int j=1;j<=n+1;j++){
sum+=g[road[i][j]][road[i][j+1]];
}
if(minx>sum){
minx=sum;
pos=road[i][0];
}
}
cout<<res<<endl;
cout<<pos<<' '<<minx;
//例如,第一条路径在road数组中是
//1 ** 0 ** 5 1 4 3 6 2 ** 0
//1代表路径序号,两个0代表起点终点
}