L2-036 网红点打卡攻略

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 210;
int g[N][N], n, m, k, cnt, res = inf, res_id;
bool vis[N];    //标记是否访问过
int s[N];       //当前旅游路线
int main(){
    cin >> n >> m;
    memset(g, 0x3f, sizeof(g));//默认初始化为最大值
    while(m--){
        int u, v, c; cin >> u >> v >> c;
        g[u][v] = g[v][u] = min(g[u][v], c);  //避免重边
    }
    cin >> k;
    for(int id = 1; id <= k; id ++ ){
        int nn; cin >> nn;
        memset(vis, false, sizeof(vis));
        for(int i = 1; i <= nn; i ++ ) cin >> s[i];
        if(nn != n) continue;   //旅游点不满n个

        bool flag = true;
        int u = 0, sum = 0;
        for(int i = 1; i <= nn; i ++ ){
            int v = s[i];
            if(vis[v] || g[u][v] == inf){
                //如果被访问过 或者 无法到达
                flag = false;
                break;
            }
            sum += g[u][v];
            vis[v] = true;
            u = v;
        }
        if(g[u][0] == inf) flag = false;   //最后的点无法到家
        if(flag){
            sum += g[u][0];
            cnt ++ ;        //合法旅游路线+1
            if(sum < res){  //更新答案,保证了注意这里等于不更新即保证了其输出序号最小
                res = sum;
                res_id = id;
            }
        }
    }
    cout << cnt << endl;//每个网红点均一次且转一圈仍可到家的个数
    cout << res_id << ' ' << res << endl;//满足攻略的最小花费
    return 0;
}

!!!看懂题后真就纯纯模拟题(用邻接矩阵存储图)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值