首页 > 其他分享 >ICPC2024昆明邀请赛 J The Quest for El Dorado 题解

ICPC2024昆明邀请赛 J The Quest for El Dorado 题解

时间:2024-05-28 21:47:36浏览次数:30  
标签:El idx ICPC2024 int 题解 edges Edge mp push

Question

The Quest for El Dorado

有一个王国,有 \(n\) 个城市和 \(m\) 条双向铁路连接这些城市。第 \(i\) 条铁路由第 \(c_i\) 家铁路公司运营,铁路的长度为\(l_i\)。

你想要环游这个国家,从城市 \(1\) 出发。为了你的旅行,你购买了 \(k\) 张火车票。第 \(i\) 张火车票用两个整数 \(a_i\) 和\(b_i\) 表示,意味着如果你使用这张票,你可以一次性通过一些铁路旅行,只要它们都是由第 \(a_i\) 家公司运营的,并且它们的总长度不超过 \(b_i\) 。当使用一张票时,也允许只停留在当前城市。你只能一次使用一张票,并且每张票只能使用一次。

由于你觉得确定使用火车票的顺序很麻烦,所以你决定按照它们当前的顺序使用。更正式地说,你要执行 \(k\) 次操作。在第\(i\) 次操作中,你可以选择留在当前城市 \(u\) ;或者选择另一个城市 \(v\),使得从城市 \(u\) 到城市 \(v\) 存在一条路径,该路径上的所有铁路都由第 \(a_i\) 家公司运营,且铁路的总长度不超过 \(b_i\),最终移到城市 \(v\)。

对于每个城市,确定在使用了所有 \(k\) 张火车票之后是否可能到达该城市。

Solution

类似于 dij 的思想,开 \(m\) 个优先队列,把边按照公司分类,当处理到 \(C\) 公司时,只需要把 \(C\) 的那个优先队列拿出来刷一次类似于 \(dij\) 的算法,把这一次加入的点放入一个集合 \(vis\) 中,在处理完 \(C\) 之后更新 \(dis\) ,把 \(vis\) 中的 \(dis\) 都改成 \(0\)

具体实现时,几下这条边是在第几张车票时加入的,如果不是在这张车票加入的话就 continue 掉

这道题需要你非常理解 dij 的思想,把 dij 的过程分阶段进行

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;

typedef pair<int, int> pii;
typedef tuple<int, int, int> t3;

const int INF = -1;
struct Edge {
    int from, to, c, l, idx;
    Edge(int from, int to, int c, int l, int idx) : from(from), to(to), c(c), l(l), idx(idx) {}
};

void solve() {
    int n, m, k; cin >> n >> m >> k;
    vector<Edge> edges; int cnt = 0;
    vector<vector<int>> g(n + 1);
    vector<int> dis(n + 1, INF);
    for (int i = 0; i < m; i++) {
        int u, v, c, l; cin >> u >> v >> c >> l;
        edges.push_back(Edge(u, v, c, l, cnt++));
        g[u].push_back(cnt - 1);
        edges.push_back(Edge(v, u, c, l, cnt++));
        g[v].push_back(cnt - 1);
    }
    typedef priority_queue<t3, vector<t3>, greater<t3>> pq;
    vector<pq> p(m + 1);
    map<int, int> mp; mp[1] = 1;
    for (auto i : g[1]) {
        Edge &e = edges[i];
        p[e.c].push({e.l, e.to, 1});
    }
    for(int i = 1; i <= k; i++) {
        int C, L; cin >> C >> L;
        while (!p[C].empty()) {
            auto [d, u, idx] = p[C].top();
            if (d > L) break;
            p[C].pop();
            if (idx != 0 && idx != i) continue;
            if (dis[u] == 0 || mp.count(u)) continue;
            mp[u] = 1;
            for (auto j : g[u]) {
                Edge &e = edges[j];
                if (d + e.l > L) continue;
                if (e.c == C) p[e.c].push({d + e.l, e.to, i});
            }
        }
        for (auto [u, _] : mp) {
            dis[u] = 0;
            for (auto j : g[u]) {
                Edge &e = edges[j];
                p[e.c].push({e.l, e.to, 0});
            }
        }
        mp.clear();
    }
    for (int i = 1; i <= n; i++) {
        if (dis[i] == 0) cout << "1";
        else cout << "0";
    }
    cout << endl;
}

signed main() {
    ios::sync_with_stdio(false);
    int t; cin >> t;
    while (t--) solve();
    return 0;
}

标签:El,idx,ICPC2024,int,题解,edges,Edge,mp,push
From: https://www.cnblogs.com/martian148/p/18218985

相关文章

  • JavaScript 中的 Range 和 Selection 对象
    JavaScript中的Range和Selection对象前言最近在做鼠标框选的需求,鼠标框选就需要用到Range和Selection对象。Range表示选择的区间范围,Selection表示选择的文档内容。下面就详细说下这两个对象一、RangeRange接口表示一个包含节点与文本节点的一部分的文档片段。......
  • css03 CSS Selectors
    https://www.w3schools.com/css/css_selectors.aspACSSselectorselectstheHTMLelement(s)youwanttostyle.CSSSelectorsCSSselectorsareusedto"find"(orselect)theHTMLelementsyouwanttostyle.WecandivideCSSselectorsintofive......
  • 解决Java.lang.NoSuchFieldException异常:全面指南 ️
    解决Java.lang.NoSuchFieldException异常:全面指南......
  • 部署Elasticsearch
    启动Elasticsearch[root@localhost~]# dockerrun-d--nameelasticsearch01-p9200:9200-p9300:9300-e"discovery.type=single-node"elasticsearch:7.6.2 进入[root@localhost~]# dockerrun-it5acf0e8da90b/bin/bash[root@localhost~]#dockerr......
  • hellgithub
    great-tables:用Python制作漂亮的表格。这个Python库可以用来制作实用且美观的表格。它提供了一套表格组件,通过组合不同的表格部分,如表头、表尾、行标签(stub)以及跨列标签(spannerlabels)等,帮助Python开发者轻松制作漂亮的数据表格。 undetected-chromedriver:绕过反爬检测的......
  • from selenium import webdriver
    url='https://chat18.aichatos8.com'chrome_binary_path='/Users/baidu/project/script/chromedriver/chrome-mac-arm64/GoogleChromeforTesting.app/Contents/MacOS/GoogleChromeforTesting'chromedriver_path='/Users/baidu/project/s......
  • 在生产服务器 Git clone 一个 Laravel 私有仓库
    本教程以aaPanel为例,请根据laravel版本安装好对应phpnginxmysqlredis等web环境所需然后安装好php所需扩展,比如fileinforedis等 将php的禁用函数开启putenv()proc_open()proc_get_status() 记得重启php然后应用安装PM2Manager,也就是安装node......
  • shell 脚本操作informix数据库
    shell脚本操作informix数据库的简单模板:functionName(){dbaccess<<!database库名;sql语句;!}栗子1:更新数据functionName(){nameStr=$1idStr=$2dbaccess<<!databasetest_db;updatetest_tablesetname='$nameStr'where......
  • ElasticSearch之聚合操作
    官网:Aggregations|ElasticsearchGuide[8.13]|ElasticElasticsearch除搜索以外,提供了针对ES数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。基本语法聚合查询的语法结构与其他查询相似,通常包含以下部分:查询条件:指定......
  • 题解/算法 {C. Goose Goose Duck}
    题解/算法{C.GooseGooseDuck}@LINK:https://codeforces.com/gym/105184;令A[N]表示这N个人的区间;比如答案是[a,b,c,d]那么他一定满足:A[a].lef<=0<=A[a].rig,A[b].lef<=1<=A[b].rig,A[c].lef<=2<=A[c].rig,…贪心;对于最开头的人来说,令集合S:......