求助! 萌新WA了一个点 #7
查看原帖
求助! 萌新WA了一个点 #7
204666
Silky_Dove楼主2020/8/26 11:13

有dalao康康啥情况嘛

萌新堆优化Dijkstra WA了一个点 #7

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e4 + 10;
const int inf = 0x3f3f3f3f;
typedef pair<long long ,long long > PII;
priority_queue<PII,vector<PII>,greater<PII> > q;
long long e[maxn],w[maxn],ne[maxn],h[maxn],idx;
long long dis[maxn];
bool vis[maxn];
long long n,m,k;
void init(){
	memset(h,-1,sizeof(h));
	memset(dis,0x3f,sizeof(dis));
	memset(vis,false,sizeof(vis));
}
void add(long long a,long long b,long long v){
	e[idx] = b;
	w[idx] = v;
	ne[idx] = h[a];
	h[a] = idx++;
}
long long dijkstra(long long mid){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,false,sizeof(vis));
	dis[1] = 0;
	q.push(make_pair(0,1));
	while(!q.empty()){
	    long long u = q.top().second;
	    q.pop();
		if(vis[u]) continue;
		else vis[u] = true;
		for(long long i = h[u];~i;i = ne[i]){
			long long v = e[i];
			long long distance = w[i];
			if(distance > mid) distance = 1;
			else distance = 0;
			
			if(dis[v] > distance + dis[u]){
				dis[v] = distance + dis[u];
				q.push(make_pair(dis[v],v));
			}
		}
	}
	return dis[n];
}
int main(){
	init();
	long long bound = -inf,ans = 0;
	cin>>n>>m>>k;
	while(m--){
		long long a,b,v;
		cin>>a>>b>>v;
		add(a,b,v);
		add(b,a,v);
		bound = max(bound,v);
	}
	if(dijkstra(0) == inf) cout<<-1;
	else{
		long long l = 0,r = bound;
		long long mid;
		while(l <= r){
			mid = (l + r) / 2;
			if(dijkstra(mid) <= k){
				ans = mid;
				r = mid - 1;
			}else l = mid + 1;
		}
		cout<<ans;
	}
	return 0;
}
2020/8/26 11:13
加载中...