话说为什么只跑一次Dij会#20WA啊
查看原帖
话说为什么只跑一次Dij会#20WA啊
213196
Wens楼主2021/10/6 10:10
#include<bits/stdc++.h>
using namespace std;

const int Maxn=1e5+1;
const int Maxm=5e5+1;

inline int Read(){
	int x=0;char ch=0;bool w=0;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w?-x:x;
}

int n,m,S,T,G,Q;
int nxt[Maxm<<1],to[Maxm<<1],head[Maxn],val[Maxm<<1],tot;
int down[Maxn],up[Maxn],dis[Maxn];
bool vis[Maxn];

inline void add(int u,int v,int w){
	++tot;
	to[tot]=v;
	val[tot]=w;
	nxt[tot]=head[u];
	head[u]=tot;
	return ;
}

inline void Dijkstra(){
	priority_queue<pair<int,int> >q;
	q.push(make_pair(0,S));
	dis[S]=0;
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		vis[u]=false;
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i];
			if(dis[u]+val[i]>G)continue;
			if(dis[u]+val[i]<dis[v]){
				if((dis[u]+val[i])*Q+down[u]<=up[u]){
					dis[v]=dis[u]+val[i];
					if(!vis[v]){
						q.push(make_pair(-dis[v],v));
						vis[v]=true;
					}
				}
				else if(v==T){
					dis[v]=dis[u]+val[i];
				}
			}
		}
	}
	return ;
}

int main(){
	n=Read(),m=Read(),S=Read(),T=Read(),G=Read(),Q=Read();
	for(int i=1;i<=n;++i){
		down[i]=Read();
		up[i]=Read();
		dis[i]=G+1;
	}
	for(int i=1;i<=m;++i){
		int u=Read(),v=Read(),w=Read();
		add(u,v,w);
		add(v,u,w);
	}
	Dijkstra();
	if(dis[T]<=G){
		printf("%d\n",dis[T]);
	}
	else {
		printf("wtnap wa kotori no oyatsu desu!");
	}
	return 0;
}
2021/10/6 10:10
加载中...