题目:
题意:
给出一张图,然后给出我们的起点,然后再给出我们需要追踪的那个人的起点和 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;
}