正题
题目大意:https://www.luogu.org/problem/P4880
题目大意
一个无向图,从bbb点出发,目标在eee点,TTT次移动在第aia_iai时移动到点xix_ixi。求最早多少能到。
解题思路
若一个点我们到不了我们就不用管它了,所以我们只要先算出单源最短路。然后枚举一波就好了。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+10;
struct edge_node{int to,next,w;
}a[10*N];
struct node{int t,w;
}p[N];
int n,m,b,e,tot,ans,t;
int ls[N],f[N];
bool v[N];
queue<int> q;
void addl(int x,int y,int w)
{a[++tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot;
}
void SPFA()
{memset(f,0x3f,sizeof(f));q.push(b);f[b]=0;v[b]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y]){v[y]=1;q.push(y);}}}v[x]=0;}
}
bool cmp(node x,node y)
{return x.t<y.t;}
int main()
{scanf("%d%d%d%d",&n,&m,&b,&e);for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addl(x,y,w);addl(y,x,w);}scanf("%d",&t);for(int i=1;i<=t;i++)scanf("%d%d",&p[i].t,&p[i].w);SPFA();sort(p+1,p+1+t,cmp);ans=2147483647;for(int i=1;i<=t;i++){if(f[e]<p[i].t) ans=min(ans,max(f[e],p[i-1].t));e=p[i].w;}ans=min(ans,max(f[e],p[t].t));printf("%d",ans);
}