[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 的字符串 s1​s2​⋯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;
}

posted @ 2025-10-21 21:11  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源