n遍dijstar跑全源最短路TLE11
查看原帖
n遍dijstar跑全源最短路TLE11
727556
wangziwenhk楼主2024/5/12 10:26
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5;
struct Edge{
	long long v,w;
};
vector<Edge>graph[MAXN];
struct Node{
	long long dis,u;
	bool operator >(const Node a)const{
		return dis>a.dis;
	}
};
priority_queue<Node,vector<Node>,greater<Node>>que;
priority_queue<long long>ans;
long long dis[MAXN];
bitset<MAXN>vis;
unordered_map<int,unordered_map<int,bool>>sher;
int n,m,k;
void dijstar(int start){
	{priority_queue<Node,vector<Node>,greater<Node>>temp;swap(que,temp);}
	for(int i=1;i<=n;i++){
		dis[i]= LLONG_MAX;
		vis[i]=false;
	}
	dis[start] = 0;
	que.push({0,start});
	while(!que.empty()){
		int u = que.top().u;
		que.pop();
		if(vis[u])continue;
		vis[u]=true;
		for(auto i:graph[u]){
			long long v = i.v,w=i.w;
			if (dis[v] > dis[u] + w) {
		        dis[v] = dis[u] + w;
		        que.push({dis[v], v});
		    }
		}
	}
}

int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		graph[a].push_back(Edge{b,c});
		graph[b].push_back(Edge{a,c});
	}
	for(int i=1;i<=n;i++){
		dijstar(i);
		for(int j=1;j<=n;j++){
			if(i!=j && !sher[j][i]){
				sher[i][j] = true;
				ans.push(dis[j]);
			}
		}
		while(ans.size()>k){
			ans.pop();
		}
	}
	printf("%lld",ans.top());
	return 0;
}
2024/5/12 10:26
加载中...