【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∼2 | 1010 | 2020 | 11 | A |
| 3∼43∼4 | 103103 | 2×1032×103 | 11 | B |
| 5∼65∼6 | 103103 | 2×1032×103 | 00 | 无 |
| 7∼87∼8 | 103103 | 2×1032×103 | 11 | 无 |
| 9∼119∼11 | 2.5×1042.5×104 | 5×1045×104 | 00 | B |
| 12∼1412∼14 | 2.5×1042.5×104 | 5×1045×104 | 00 | 无 |
| 15∼1615∼16 | 2.5×1042.5×104 | 5×1045×104 | 11 | B |
| 17∼1917∼19 | 104104 | 2×1042×104 | 11 | C |
| 20∼2120∼21 | 2.5×1042.5×104 | 5×1045×104 | 11 | C |
| 22∼2522∼25 | 2.5×1042.5×104 | 5×1045×104 | 11 | 无 |
- 特殊性质 A:保证 wi≤2×105wi≤2×105。
- 特殊性质 B:保证 wiwi 全部相等。
- 特殊性质 C:保证非负整数 dd 存在。
【附件】
思路
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;
}

浙公网安备 33010602011771号