第二个点过不去?????
  • 板块P4880 抓住czx
  • 楼主Alone0213
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/19 18:53
  • 上次更新2023/11/4 03:16:30
查看原帖
第二个点过不去?????
235786
Alone0213楼主2021/10/19 18:53
#include<bits/stdc++.h>
#define N 1600000
#define int long long
using namespace std;

struct node{
	int to,ne,w;
}edge[1060061];
int head[N],dis[N],vis[N];
struct nodd{
	int ti;
	int p;
	bool operator <(const nodd&A) const{
		return ti<A.ti;
	}
}cxz[N];
inline void read(int &x){
	x=0; int y=1; char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	x*=y;
}
int n,m,b,e,cnt,T,ans=0x7fffffff;
inline void add(int s,int t,int v){
	edge[++cnt].ne=head[s];
	edge[cnt].to=t;
	edge[cnt].w=v;
	head[s]=cnt;
}
queue<int> q;
void spfa(int s){
	fill(dis+1,dis+1+n,0x7fffffff);
	q.push(s);
	vis[s]=1;
	dis[s]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u]; i; i=edge[i].ne){
			int v=edge[i].to;
			if(dis[v]>dis[u]+abs(edge[i].w)){
				dis[v]=dis[u]+edge[i].w;
				if(!vis[v]){
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
}
signed main(){
	read(n);read(m);read(b);read(e);
	for(int i=1; i<=m; i++){
		int _,__,___;
		read(_);read(__);read(___);
		add(_,__,___);
		add(__,_,___);
	}
	read(T);
	for(int i=1; i<=T; i++) read(cxz[i].ti),read(cxz[i].p);
	spfa(b);
	sort(cxz+1,cxz+1+T);
	if(T==0) return printf("%lld",dis[e]),0;
	if(dis[e]<cxz[1].ti) return printf("%lld",dis[e]),0;
	for(int i=1; i<=T; i++){
		if(dis[cxz[i].p]<=cxz[i].ti){
			return printf("%lld",dis[cxz[i].p]),0;
		}
	}
	return 0;
}
2021/10/19 18:53
加载中...