[ICPC 2024 Kunming I] 冲向黄金城题解
题目描述
某个国家有 n 座城市以及 m 条连接城市的双向铁路。第 i 条铁路由第 ci 家铁路公司运营,铁路的长度是 li。
您想要从城市 1 开始进行全国旅行。您已经为旅行购买了 k 张车票。第 i 张车票可以记为两个整数 ai 和 bi,表示如果您使用了这张车票,就可以一次性经过若干条均由公司 ai 运营的,且总长度不超过 bi 的铁路。即使您使用了车票,也可以选择待在当前城市。您同时只能使用一张车票,且每张车票只能使用一次。
由于决定车票的使用顺序太麻烦了,您打算直接按现有的顺序使用车票。更正式地,您将执行 k 次操作。在第 i 次操作中,您可以选择待在当前的城市 u;也可以选择一座不同的城市 v,满足城市 u 和 v 之间存在一条路径,且路径上的所有铁路均由公司 ai 运营,且铁路总长不超过 bi,然后移动到城市 v。
对于每座城市,判断在使用 k 张车票之后能否到达该城市。
输入格式
有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据:
第一行输入三个整数 n,m 和 k(2≤n≤5×105,1≤m≤5×105,1≤k≤5×105)表示城市的数量,铁路的数量以及车票的数量。
对于接下来 m 行,第 i 行输入四个整数 ui,vi,ci 和 li(1≤ui,vi≤n,ui=vi,1≤ci≤m,1≤li≤109),表示第 i 条铁路连接了城市 ui 和 vi,该铁路由公司 ci 运营,且铁路长度为 li。注意,可能有多条铁路连接同一对城市。
对于接下来 k 行,第 i 行输入两个整数 ai 和 bi(1≤ai≤m,1≤bi≤109),表示如果您使用了第 i 张车票,就可以一次性经过若干条均由公司 ai 运营的,且总长度不超过 bi 的铁路。
保证所有数据 n 之和,m 之和与 k 之和均不超过 5×105。
输出格式
每组数据输出一行一个长度为 n 的字符串 s1s2⋯sn,其中每个字符要么是 0,要么是 1。如果您可以用 k 张车票从城市 1 到达城市 i,则 si=1;否则 si=0。
输入输出样例
输入 #1复制
2 5 6 4 1 2 1 30 2 3 1 50 2 5 5 50 3 4 6 10 2 4 5 30 2 5 1 40 1 70 6 100 5 40 1 30 3 1 1 2 3 1 10 1 100
输出 #1复制
11011 100
说明/提示
对于第一组样例数据:
- 为了到达城市 4,您可以使用第 1 张车票从城市 1 移动到城市 2,然后在使用第 2 张车票的时候待在城市 2,然后使用第 3 张车票从城市 2 移动到城市 4,然后在使用第 4 张车票的时候待在城市 4。
- 为了到达城市 5,您可以使用第 1 张车票,经由第 1 条和第 6 条铁路从城市 1 移动到城市 5,然后在使用后续车票的时候待在城市 5。
- 由于您不能更改使用车票的顺序,您无法到达城市 3。
思路
直接写即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n,m,k,u,vv,c,ll,aa,bb;
bool bo[500005];
struct one{
long long a,b,c;
};
vector<one> v[500005];
vector<long long> v2;
priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>> q[500005];
int main(){
cin>>t;
while(t--){
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
while(q[i].size()>=1){
q[i].pop();
}
}
for(int i=1;i<=n;i++){
bo[i]=0;
v[i].clear();
}
for(int i=1;i<=m;i++){
cin>>u>>vv>>c>>ll;
v[u].push_back({vv,c,ll});
v[vv].push_back({u,c,ll});
}
for(int i=0;i<v[1].size();i++){
q[v[1][i].b].push({v[1][i].c,v[1][i].a});
}
bo[1]=1;
while(k--){
cin>>aa>>bb;
v2.clear();
while(q[aa].size()>=1){
pair<long long,long long> tt=q[aa].top();
long long fx=tt.first,fy=tt.second;
if(fx>=bb+1){
break;
}
q[aa].pop();
if(bo[fy]!=1){
bo[fy]=1;
v2.push_back(fy);
for(int i=0;i<v[fy].size();i++){
one zz=v[fy][i];
if(bo[zz.a]==0&&zz.b==aa){
q[aa].push({fx+zz.c,zz.a});
}
}
}
}
for(int i=0;i<v2.size();i++){
long long a1=v2[i];
for(int j=0;j<v[a1].size();j++){
if(bo[v[a1][j].a]==0){
q[v[a1][j].b].push({v[a1][j].c,v[a1][j].a});
}
}
}
}
for(int i=1;i<=n;i++){
cout<<bo[i];
}
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号