题目描述
财务计划要从家里出发,去N个城市出差,然后再回到家中,但N个出差地点之间不一定都能通车,现在他要筛选出花费最少的路径,你能帮帮他吗?
输入描述
第一行为两个正整数N和M( 1 ≤ N ≤ 300 1≤N≤300 1≤N≤300, 1 ≤ M ≤ N ( N + 1 ) / 2 1≤M≤N(N+1)/2 1≤M≤N(N+1)/2),分别表示有N个出差地点和这些地点之间的M条通路,其中出差地点用1到N编号,而财务的家所在城市用编号0表示。
随后的M行,每行给出通路连接的两个城市和这条通路上的花费,格式为:
城市A 城市B 花费
通路是双向的,且两个城市间最多有一条通路,不存在自环。保证所有花费大于0。
再下一行给出一个正整数
K
(
K
<
=
20000
)
K(K<=20000)
K(K<=20000),表示现在有K条推荐路径(注意:给出的路径不一定能通过或可能不满足财务的要求)。
接下来K行每一行表示一个推荐路径,第一个整数n表示途径的城市数,后面有 n ( n < = 2 ∗ N ) n(n<=2*N) n(n<=2∗N)个整数 x i ( 1 ≤ x i ≤ N ) x_i(1≤x_i≤N) xi(1≤xi≤N)(表示途经的城市(不包括财务的家),如:
3 1 2 3
表示实际路径为
0
→
1
→
2
→
3
→
0
0→1→2→3→0
0→1→2→3→0。
输出描述
请你检验给出的K条推荐路径,当它满足:
1.给出的路径能实际通车,即路径中相邻城市存在通路;
2.给出的路径恰好能都到达N个出差城市一次,即不能漏掉某个城市,也不能重复到达。
则称这条路径是可行的。
对于给出的K条推荐路径,请输出其中可行路径中最少的花费,若不存在可行路径,请输出"-1"。(题目保证花费和不超过int范围)
示例
输入
5 10
0 1 5
0 5 12
1 2 2
2 3 8
3 4 13
1 3 11
0 2 5
0 4 9
4 5 6
3 5 7
5
5 1 3 2 3 1
5 3 2 1 4 5
5 2 1 3 5 4
6 1 2 3 4 5 1
5 1 2 3 5 4
输出
37
AC的C++代码
#include<iostream>
using namespace std;
int a[310]={0};
int b[310][310]={0};
long long Min=-1;
int main(){
int n,m,i,h;
cin>>n>>m;
h=n;
for(i=0;i<m;i++){
int p,q,money;
cin>>p>>q>>money;
b[p][q]=money;
b[q][p]=money;
}
cin>>m;
for(i=0;i<m;i++){
cin>>n;
int p=0,q=0,l=1,sum=0;
for(int y=0;y<n;y++){
cin>>q;
a[q]++;
if(b[p][q]&&a[q]==1)
sum+=b[p][q];
else l=0;
p=q;
}
if(b[q][0]) sum+=b[q][0];
else l=0;
for(int y=1;y<=h;y++) if(a[y]==0){
l=0;
break;
}
if(l && (Min==-1||sum<Min) )
Min=sum;
for(int y=0;y<=300;y++)
a[y]=0;
}
cout<<Min;
return 0;
}