洛谷 P4880 抓住czx【DIJ】


题目:

传送门


题意:

给出一张图,然后给出我们的起点,然后再给出我们需要追踪的那个人的起点和 t a ta ta之后会走到的点和时间点


分析:

我们先跑 d i j dij dij,求出我们从起点出发到要追踪的那个人可能会经过的那些点的距离
对于我们是否能抢在那个人之前到某个点,判断依据就可以先将可能经过的点按照时间升序排序,然后如果我们到达这个点的时间比 t a ta ta要去到下个点的时间早,那么说明我们可以待在这个点,守株待兔


代码:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define LL long long 
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
struct qwq{
	int t,k;
}bc[100005];
struct node{
	int to,next,w;
}e[1000005];
int ls[1000005],cnt=0;
void add(int x,int y,int w)
{
	e[cnt]=(node){y,ls[x],w};
	ls[x]=cnt++;
	return;
}
struct dui{
	int num,w;
	bool operator < (const dui &www) const {return w>www.w;}
};
int dis[100005],n=read(),m=read(),s=read();
void dij()
{
	for(int i=1;i<=n;i++) dis[i]=2147483647;
	dis[s]=0; 
	priority_queue<dui> q;
	q.push((dui){s,0});
	while(q.size())
	{
		int u=q.top().num,v=q.top().w;
		q.pop();
		if(v!=dis[u]) continue;
		for(int i=ls[u];~i;i=e[i].next)
		  if(v+e[i].w<dis[e[i].to])
		    dis[e[i].to]=v+e[i].w,q.push((dui){e[i].to,dis[e[i].to]});
	}
	return;
}
bool cmp(qwq x,qwq y) {return x.t<y.t;}
int main()
{
	memset(ls,-1,sizeof(ls));
	bc[1].k=read();
	if(s==bc[1].k) return !printf("0");
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read(),w=read();
		add(x,y,w);add(y,x,w);
	}
	int q=read()+1;
	for(int i=2;i<=q;i++) bc[i].t=read(),bc[i].k=read();
	sort(bc+1,bc+1+q,cmp);
	dij();
	for(int i=2;i<=q;i++) if(dis[bc[i-1].k]<bc[i].t) return !printf("%d",max(bc[i-1].t,dis[bc[i-1].k]));
	cout<<max(dis[bc[q].k],bc[q].t);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值