106752024-04-07 21:16:33999Nagysebességű vasútcpp17Időlimit túllépés 0/1002.099s30220 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
#include <queue>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n,m;cin>>n>>m;
	vector<vector<pair<int,int>>> v(n);
	for(int i = 0;i<m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		v[a].push_back({b,c});
		v[b].push_back({a,c});
	}
	vector<int> disS(n,INT_MAX),disE(n,INT_MAX),os(n,-1);
	priority_queue<pair<int, int>> q;
	disS[0]=0;
	q.push({0,0});
	while(!q.empty()){
		auto[c,a]=q.top();
		q.pop();
		c*=-1;
		if(c>disS[a])continue;
		for(auto u:v[a]){
			int b=u.first,w=u.second;
			if(disS[b]>disS[a]+w){
				disS[b]=disS[a]+w;
				q.push({-disS[b],b});
				os[b]=a;
			}
		}
	}
	vector<bool> shortestPath(n);
    int curr = n-1;
    while (curr!=-1) {
        shortestPath[curr]=true;
        curr=os[curr];
    }
	q.push({0,n-1});
	disE[n-1]=0;
	while(!q.empty()){
		auto[c,a]=q.top();
		q.pop();
		c*=-1;
		if(c>disE[a])continue;
		for(auto u:v[a]){
			int b=u.first,w=u.second;
			if(disE[b]>disE[a]+w){
				disE[b]=disE[a]+w;
				q.push({-disE[b],b});
				os[b]=a;
			}
		}
	}
	int ans=INT_MAX;
	for(int i = 0;i<n;i++){
		for(auto u : v[i]){
			int a=i,b=u.first,c=u.second;
			if(disS[a]+disE[b]+c>disS[n-1]){
				if(disS[a]+disE[b]+c-disS[n-1]+1<c&&!(shortestPath[a]&&shortestPath[b]&&disS[n-1]==c+disS[a]+disE[b])){//cout<<a<<' '<<b<<endl;
					ans=min(ans,disS[a]+disE[b]+c-disS[n-1]+1);
				}
			}
			if(disS[b]+disE[a]+c>disS[n-1]){
				if(disS[b]+disE[a]+c-disS[n-1]+1<c&&!(shortestPath[a]&&shortestPath[b]&&disS[n-1]==c+disE[a]+disS[b])){//cout<<a<<' '<<b<<endl;
					ans=min(ans,disS[b]+disE[a]+c-disS[n-1]+1);
				}
			}
		}
	}cout<<(ans==INT_MAX?-1:ans)<<endl;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1828 KiB
2Elfogadva3ms2024 KiB
subtask20/35
3Időlimit túllépés2.099s2452 KiB
4Időlimit túllépés2.081s2544 KiB
5Hibás válasz4ms2656 KiB
6Elfogadva4ms2692 KiB
7Elfogadva4ms2904 KiB
8Hibás válasz4ms2668 KiB
subtask30/30
9Elfogadva72ms16100 KiB
10Elfogadva72ms16056 KiB
11Elfogadva71ms16252 KiB
12Elfogadva71ms16252 KiB
13Elfogadva72ms16320 KiB
14Hibás válasz75ms16504 KiB
subtask40/35
15Időlimit túllépés2.069s15832 KiB
16Időlimit túllépés2.053s15820 KiB
17Időlimit túllépés2.046s15776 KiB
18Időlimit túllépés2.082s15964 KiB
19Elfogadva305ms29884 KiB
20Elfogadva287ms29884 KiB
21Elfogadva300ms29840 KiB
22Elfogadva289ms29852 KiB
23Elfogadva307ms30220 KiB
24Hibás válasz145ms21596 KiB
25Elfogadva71ms17036 KiB
26Elfogadva72ms17036 KiB
27Hibás válasz79ms17368 KiB