专栏文章
题解:P14307 【MX-J27-T4】点灯
P14307题解参与者 4已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mini2iz7
- 此快照首次捕获于
- 2025/12/02 02:46 3 个月前
- 此快照最后确认于
- 2025/12/02 02:46 3 个月前
一眼看上去有些难。
如果第一个城市的所有道路第 天不开放,则答案显然为 。
然后,我们发现:如果一个城市上第 天有人,那么第 天也有人(肯定有人随便找一条边走一天,然后再走回来)。
于是,我们令 表示模 余 的天数中,最快什么时候有人。因为在这之后,肯定也有人。
转移可以用形如 dijkstra 的方法。初始时 。
所以,我们要求的就是
时间复杂度 。
当然,这个建模可以稍微进行一些拓展。如果题目存在(一些诡异的条件)说 步后可以回来,复杂度就是 。
代码:
CPP#include<bits/stdc++.h>
using namespace std;
//#define int long long
int dij[30010][2];
struct edge{
int to,v;
};
vector<edge> e[30010];
struct node{
int now,type,v;
bool operator <(const node tmp)const
{
return v>tmp.v;
}
};
void dijk()
{
priority_queue<node> q;
memset(dij,0x3f,sizeof(dij));dij[1][0]=0;
q.push((node){1,0,0});
while(q.size())
{
auto t=q.top();q.pop();
if(dij[t.now][t.type]<t.v)continue;
for(auto x:e[t.now])
{
int to=max(x.v,t.v+1);
if(x.v>t.v+1&&x.v%2!=(t.v+1)%2)to++;
if(dij[x.to][to&1]>to)
{
dij[x.to][to&1]=to;
q.push((node){x.to,to&1,to});
}
}
}
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);
int c,t;cin>>c>>t;
while(t--)
{
int n,m,k;cin>>n>>m>>k;
for(int i=1;i<=n;i++)
e[i].clear();
for(int i=1;i<=m;i++)
{
int u,v,w;cin>>u>>v>>w;
e[u].push_back((edge){v,w});
e[v].push_back((edge){u,w});
}
bool f=1;
for(auto x:e[1])
{
if(x.v==1)f=0;
}
if(f)
{
cout<<"-1\n";
continue;
}
dijk();
// for(int i=1;i<=n;i++)
// cout<<dij[i][0]<<' ';
// cout<<'\n';
// for(int i=1;i<=n;i++)
// cout<<dij[i][1]<<' ';
// cout<<'\n';
int ans=0x3f3f3f3f;
for(int x=0;x<2;x++)
{
int now=0;
for(int i=1;i<=n;i++)
now=max(now,dij[i][x]);
ans=min(ans,now);
}
if(ans==0x3f3f3f3f)cout<<"-1\n";
else cout<<ans*k<<'\n';
}
return 0;
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...