【MX-J27】梦熊 CSP-J 2025 模拟赛(同步赛)【MX-J27-T4】点灯题解

题目描述

有一个由 nn 座城市构成的国家,其城市之间将由 mm 条双向道路互相连接,第 ii 条道路连接城市 uiui​ 和城市 vivi​;但由于工程延期,第 ii 条道路只在第 wi​ 天及以后开放。保证这些双向道路两两不同,每条道路连接两个不同的城市,且在所有道路开放后,从城市 11 出发可以到达其余所有城市。

每座城市都设有若干街灯,用于夜间照明。每个夜晚降临后,每位点灯人仅点亮自己所在城市的灯;而日出后,点灯人又会熄灭自己所在城市的灯。初始时,有充分多的点灯人在城市 11。这被记作第 00 夜。

为了给国家的每座城市照明,每位点灯人必须在每天白天沿城市之间的道路移动。具体地,对每个正整数 tt,设第 t−1t−1 夜某位点灯人在城市 xx,则他在第 tt 天必须沿着某条一端为城市 xx 且已经开放(即 ww 值不超过 tt)的道路,随后恰好在第 tt 夜到达道路的另一个端点。如果有多条不同的道路,则每位点灯人会独立地随机选择一条;特别地,如果这样的道路不存在,则这位点灯人会失望地离开这个国家。

你想知道是否存在一个非负整数 dd,满足在第 dd 夜,所有城市内的灯都被点亮;换句话说,在第 dd 夜,每个城市内都存在至少一位点灯人。如果存在,你还希望找到符合条件的最小可能的 dd。

出于某些原因,给定一个参数 o∈{0,1}o∈{0,1},你只需要在 dd 存在时输出 o⋅do⋅d 的值即可。

输入格式

本题有多组测试数据。

第一行,两个整数 c,Tc,T,分别表示测试点编号与测试数据组数。接下来输入每组测试数据。样例满足 c=0c=0。

对于每组测试数据:

  • 第一行,三个正整数 nn,mm 和 oo,分别表示城市数量,道路数量,和给定的参数。
  • 接下来 mm 行,第 ii 行包含三个整数 ui,vi,wiui​,vi​,wi​。

保证这些双向道路两两不同,每条道路连接两个不同的城市,且在所有道路开放后,从城市 11 出发可以到达其余所有城市。

输出格式

对于每组测试数据,输出一行一个整数:

  • 若存在满足条件的非负整数 dd,则输出满足条件的最小可能的 dd 与 oo 的乘积;
  • 若不存在满足条件的非负整数 dd,输出 −1−1。

输入输出样例

输入#1

输出#1

说明/提示

【样例解释 #1】

对于第一组测试数据:

  • 在第 00 夜,只有第 11 个城市存在充分多的点灯人,灯亮的城市为第 11 个城市。
  • 在第 11 天,第 11 个城市的点灯人全部移动至城市 33 和 44。注意,点灯人不能移动到城市 22,因为道路 (1,2)(1,2) 在第 w=2w=2 天后才建设完成。因此,在第 11 夜,灯亮的城市为第 3,43,4 个城市;由于点灯人数量充分多,所以必然有一些点灯人到达城市 33,而另外一些点灯人到达城市 44。
  • 在第 22 天,第 33 个城市的点灯人全部移动到城市 1,41,4,而第 44 个城市的点灯人全部移动到城市 1,31,3。因此,在第 22 夜,灯亮的城市有第 1,3,41,3,4 个城市。
  • 在第 33 天,第 11 个城市的点灯人全部移动到城市 2,3,42,3,4,第 33 个城市的点灯人全部移动到城市 1,41,4,而第 44 个城市的点灯人全部移动到城市 1,31,3。因此,在第 33 夜,所有城市的灯都被点亮。

因此,d=3d=3,输出 o⋅do⋅d 即 33。

对于第二组测试数据,在第 11 天,城市 11 邻接的所有道路都未开放,因此所有点灯人都无法移动,他们会离开这个国家。因此,不存在符合条件的非负整数 dd,输出 −1−1。

【样例 #2】

见附件中的 lamplighter/lamplighter2.inlamplighter/lamplighter2.in 与 lamplighter/lamplighter2.anslamplighter/lamplighter2.ans。

该组样例满足测试点 1∼21∼2 的约束条件。

【样例 #3】

见附件中的 lamplighter/lamplighter3.inlamplighter/lamplighter3.in 与 lamplighter/lamplighter3.anslamplighter/lamplighter3.ans。

该组样例满足测试点 3∼43∼4 的约束条件。

【样例 #4】

见附件中的 lamplighter/lamplighter4.inlamplighter/lamplighter4.in 与 lamplighter/lamplighter4.anslamplighter/lamplighter4.ans。

该组样例满足测试点 7∼87∼8 的约束条件。

【样例 #5】

见附件中的 lamplighter/lamplighter5.inlamplighter/lamplighter5.in 与 lamplighter/lamplighter5.anslamplighter/lamplighter5.ans。

该组样例满足测试点 12∼1412∼14 的约束条件。

【样例 #6】

见附件中的 lamplighter/lamplighter6.inlamplighter/lamplighter6.in 与 lamplighter/lamplighter6.anslamplighter/lamplighter6.ans。

该组样例满足测试点 15∼1615∼16 的约束条件。

【样例 #7】

见附件中的 lamplighter/lamplighter7.inlamplighter/lamplighter7.in 与 lamplighter/lamplighter7.anslamplighter/lamplighter7.ans。

该组样例满足测试点 17∼1917∼19 的约束条件。

【样例 #8】

见附件中的 lamplighter/lamplighter8.inlamplighter/lamplighter8.in 与 lamplighter/lamplighter8.anslamplighter/lamplighter8.ans。

该组样例满足测试点 22∼2522∼25 的约束条件。

【数据范围】

本题共 2525 个测试点,每个 44 分。

对于所有数据,保证:

  • 1≤T≤101≤T≤10;
  • 2≤n≤2.5×1042≤n≤2.5×104;
  • n−1≤m≤5×104n−1≤m≤5×104;
  • o∈{0,1}o∈{0,1};
  • 对所有 1≤i≤m1≤i≤m,1≤ui,vi≤n1≤ui​,vi​≤n,ui≠viui​=vi​,1≤wi≤1091≤wi​≤109;
  • 保证双向道路两两不同;
  • 保证在所有道路开放后,从城市 11 出发可以到达其余所有城市。
测试点编号n≤n≤m≤m≤o=o=特殊性质
1∼21∼21010202011A
3∼43∼41031032×1032×10311B
5∼65∼61031032×1032×10300
7∼87∼81031032×1032×10311
9∼119∼112.5×1042.5×1045×1045×10400B
12∼1412∼142.5×1042.5×1045×1045×10400
15∼1615∼162.5×1042.5×1045×1045×10411B
17∼1917∼191041042×1042×10411C
20∼2120∼212.5×1042.5×1045×1045×10411C
22∼2522∼252.5×1042.5×1045×1045×10411
  • 特殊性质 A:保证 wi≤2×105wi​≤2×105。
  • 特殊性质 B:保证 wiwi​ 全部相等。
  • 特殊性质 C:保证非负整数 dd 存在。

【附件】

lamplighter.zip

思路

BFS,查找最优解即可。

代码见下

#include<bits/stdc++.h> 
using namespace std;
//__inline long long max(long long &a,long long &b){
//	return a>b?a:b;
//}
long long c,t,n,m,o,os=1e18+7,f[25005][2],le=0,lf=0;
struct one{
	long long u,w;
};
struct two{
	long long u,v,w;
}a[50005];
vector<one> v[25005];
bool ool=0;
queue<long long> q;
void abc(){
	q.push(1);
	while(q.size()>=1){
		long long a1=q.front();
		q.pop();
		bool loo=0;
		for(int i=0;i<v[a1].size();i++){
			long long tt=v[a1][i].u;
			if(v[a1][i].w%2==1){
				if(f[a1][0]<=1e15&&f[tt][1]>=max(f[a1][0]+1,v[a1][i].w)+1){
					f[tt][1]=max(f[a1][0]+1,v[a1][i].w);
					loo=1;
				}
				if(f[a1][1]<=1e15&&f[tt][0]>=max(f[a1][1]+1,v[a1][i].w+1)+1){
					f[tt][0]=max(f[a1][1]+1,v[a1][i].w+1);
					loo=1;
				}    
			}
			else{
				if(f[a1][0]<=1e15&&f[tt][1]>=max(f[a1][0]+1,v[a1][i].w+1)+1){
					f[tt][1]=max(f[a1][0]+1,v[a1][i].w+1);
					loo=1;
				}
				if(f[a1][1]<=1e15&&f[tt][0]>=max(f[a1][1]+1,v[a1][i].w)+1){
					f[tt][0]=max(f[a1][1]+1,v[a1][i].w);
					loo=1;
				}                  
			}
			if(loo==1){
				q.push(tt);
			}
		}		
	}
	
	return ;
}
int main(){
	//freopen("lamplighter.in","r",stdin);
	//freopen("lamplighter.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>c>>t;
	while(t--){
		cin>>n>>m>>o;
		os=1e18+7;
		for(int i=1;i<=n;i++){
			v[i].clear();
			f[i][0]=f[i][1]=1e18+7;
		}
		for(int i=1;i<=m;i++){
			cin>>a[i].u>>a[i].v>>a[i].w;
			if(a[i].u==1||a[i].v==1){
				os=min(os,a[i].w);
			}
			v[a[i].u].push_back({a[i].v,a[i].w});
			v[a[i].v].push_back({a[i].u,a[i].w});
		}
		f[1][0]=0;
		abc();
		ool=0;
		for(int i=1;i<=m;i++){
			if(f[a[i].u][0]<=1e15&&f[a[i].v][0]<=1e15){
				ool=1;
				break;
			}
			if(f[a[i].u][1]<=1e15&&f[a[i].v][1]<=1e15){
				ool=1;
				break;
			}
		}
		if(n==1){
			cout<<0<<endl;
		}
		else if(ool==0||os>=2){
			cout<<-1<<endl;
		}
		else{
			if(o==0){
				cout<<0<<endl;
			}
			else{
				le=lf=0;
				for(int i=1;i<=n;i++){
					le=max(le,f[i][0]);
					lf=max(lf,f[i][1]);
				}
				cout<<min(le,lf)<<endl;
			}
		}
	}
	return 0; 	
}

posted @ 2025-10-25 12:04  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源