抓住czx

题目链接:抓住czx


按照时间排序之后,枚举每一个点即可。

这个点什么时候是有贡献的呢?到这个点的时间小于走的时间。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,M=1e6+10;
int n,m,s,t,d[N],ts,vis[N],res=1e18;
int head[N],nex[M],to[M],w[M],tot;
struct node{int a,x;}q[N];
int cmp(node s1,node s2){return s1.a<s2.a;}
inline void ade(int a,int b,int c){
	to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;
}
inline void add(int a,int b,int c){ade(a,b,c);	ade(b,a,c);}
void Dijkstra(){
	priority_queue<pair<int,int> > q; memset(d,0x3f,sizeof d); q.push({0,s}); d[s]=0;
	while(q.size()){
		int u=q.top().second;	q.pop();
		if(vis[u])	continue;	vis[u]=1;
		for(int i=head[u];i;i=nex[i]){
			if(d[to[i]]>d[u]+w[i]){
				d[to[i]]=d[u]+w[i];	q.push({-d[to[i]],to[i]});
			}
		}
	}
}
signed main(){
	cin>>n>>m>>s>>t;
	for(int i=1,a,b,c;i<=m;i++)	scanf("%lld %lld %lld",&a,&b,&c),add(a,b,c);
	cin>>ts;
	for(int i=1;i<=ts;i++)	scanf("%lld %lld",&q[i].a,&q[i].x);
	Dijkstra();	sort(q+1,q+1+ts,cmp);
	for(int i=1;i<=ts;i++){
		if(d[t]<q[i].a)	res=min(res,max(d[t],q[i-1].a));	t=q[i].x;
	}
	res=min(res,max(d[t],q[ts].a));
	cout<<res;
	return 0;
}
发布了809 篇原创文章 · 获赞 246 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/105187461