第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——J题 这是一题简单的模拟

本文探讨如何帮助财务规划者找到从家出发,经过N个城市出差并返回的最少花费路径,考虑城市间双向通路和推荐路径的可行性。输入包含城市数量、通路信息、推荐路径及花费,目标是找出满足条件的最经济路线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

财务计划要从家里出发,去N个城市出差,然后再回到家中,但N个出差地点之间不一定都能通车,现在他要筛选出花费最少的路径,你能帮帮他吗?

输入描述

第一行为两个正整数N和M( 1 ≤ N ≤ 300 1≤N≤300 1N300 1 ≤ M ≤ N ( N + 1 ) / 2 1≤M≤N(N+1)/2 1MN(N+1)/2),分别表示有N个出差地点和这些地点之间的M条通路,其中出差地点用1到N编号,而财务的家所在城市用编号0表示。

随后的M行,每行给出通路连接的两个城市和这条通路上的花费,格式为:

城市A 城市B 花费

通路是双向的,且两个城市间最多有一条通路,不存在自环。保证所有花费大于0。
再下一行给出一个正整数 K ( K < = 20000 ) K(K<=20000) KK<=20000,表示现在有K条推荐路径(注意:给出的路径不一定能通过或可能不满足财务的要求)。

接下来K行每一行表示一个推荐路径,第一个整数n表示途径的城市数,后面有 n ( n < = 2 ∗ N ) n(n<=2*N) n(n<=2N)个整数 x i ( 1 ≤ x i ≤ N ) x_i(1≤x_i≤N) xi(1xiN)(表示途经的城市(不包括财务的家),如:

3 1 2 3
表示实际路径为 0 → 1 → 2 → 3 → 0 0→1→2→3→0 01230

输出描述

请你检验给出的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值