P10206,倒数第三和第四个点TLE,有大佬帮忙找一下原因吗
  • 板块学术版
  • 楼主Lycdeer
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/25 15:59
  • 上次更新2024/10/25 17:48:37
查看原帖
P10206,倒数第三和第四个点TLE,有大佬帮忙找一下原因吗
1088782
Lycdeer楼主2024/10/25 15:59
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
long long n,m,S,T,L,K,ans;
long long h[N],to[N],val[N],nxt[N],cnt;
long long dis[N],p[N],z[N];
bool vis[N];
struct node{
	long long v,w;
	friend bool operator<(node x,node y){
		return x.w>y.w;
	}
};
priority_queue<node> q;
void add(long long a,long long b,long long c){
	to[++cnt]=b;
	val[cnt]=c;
	nxt[cnt]=h[a];
	h[a]=cnt;
}
void Dijkstra(long long s){
	for(int i=1;i<=n;i++) dis[i]=1e18,vis[i]=0;
	dis[s]=0;
	q.push(node{s,0});
	while(q.size()){
		node k=q.top(); q.pop();
		vis[k.v]=true;
		for(int i=h[k.v];i;i=nxt[i]){
			if(vis[to[i]]) continue;
			if(dis[to[i]]>k.w+val[i]){
				dis[to[i]]=k.w+val[i];
				q.push(node{to[i],dis[to[i]]});
			} 
		}
	}
}
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m;
	cin>>S>>T>>L>>K;
	for(int i=1;i<=m;i++){
		long long a,b,c; cin>>a>>b>>c;
		add(a,b,c); add(b,a,c);
	}
	Dijkstra(S);
	for(int i=1;i<=n;i++) p[i]=dis[i];
	if(p[T]<=K){
		cout<<(n*n-n)/2;
		return 0;
	}
	Dijkstra(T);
	for(int i=1;i<=n;i++) z[i]=dis[i];
	sort(z+1,z+n+1);
	for(int i=1;i<=n;i++){
		long long l=1,r=n;
		while(l<=r){
			long long mid=(l+r)/2;
			if(p[i]+z[mid]+L<=K) l=mid+1;
			else r=mid-1;
		}
		ans+=l-1;
	}
	cout<<ans;
	return 0;
}
2024/10/25 15:59
加载中...