結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-07-06 20:47:56 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 105 ms / 2,000 ms |
| コード長 | 2,314 bytes |
| コンパイル時間 | 1,408 ms |
| コンパイル使用メモリ | 89,404 KB |
| 実行使用メモリ | 13,664 KB |
| 最終ジャッジ日時 | 2024-11-08 00:58:00 |
| 合計ジャッジ時間 | 3,162 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 |
ソースコード
#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
#include<vector>
#include<algorithm>
#include<queue>
#include<cassert>
using namespace std;
#define int long long
#define rep(i,n) for(int i = 0; i < (n); i++)
#define endl "\n"
const long long INF = (long long)1e16;
const long long MOD = (long long)1e9 + 7;
string yn(bool f){return f?"Yes":"No";}
string YN(bool f){return f?"YES":"NO";}
#define MAX 2100
int N, M, P, Q, T;
void dijkstra(vector<int> &dis, vector<vector<pair<int,int>>> G, int s){
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> Q;
dis.resize(N, INF);
dis[s] = 0;
Q.push(make_pair(0,s));
while(!Q.empty()){
pair<int,int> p = Q.top(); Q.pop();
int n = p.second;
assert(n < N);
// cout<<"dis = "<<p.first<<" "<<n<<endl;
if(dis[n] < p.first) continue;
for(pair<int,int> y : G[n]){// cout<<"G[n] "<<y.first<<" cost = "<<y.second<<endl;
if(dis[n] + y.second < dis[y.first]){
dis[y.first] = dis[n] + y.second;
Q.push(make_pair(dis[y.first], y.first));
}
}
}
}
signed main(){
cin.tie(0);
ios::sync_with_stdio(false);
cout<<fixed<<setprecision(10);
vector<vector<pair<int,int>>> G;
vector<int> dis, disp, disq;
int ans = -1;
int a, b, c;
cin>>N>>M>>P>>Q>>T;
P--, Q--;
G.resize(N);
for(int i = 0; i < M; i++){
cin>>a>>b>>c;
a--,b--;
assert(a < N);
assert(b < N);
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
}
// cout<<"AAA "<<endl;
dijkstra(dis, G, 0);//cout<<"DDD "<<endl;
dijkstra(disp, G, P);
dijkstra(disq, G, Q);
// cout<<"BBB "<<endl;
// cout<<"Q = "<<Q<<" "<<"P = "<<P<<endl;
// for(int i = 0; i < N; i++){
// cout<<dis[i]<<" "<<disq[i]<<" "<<disp[i]<<endl;
// }
if(dis[P] + disp[Q] + disq[0] <= T) ans = T;
if(dis[Q] + disq[P] + disp[0] <= T) ans = T;
// cout<<dis[Q]<<" "<<dis[P]<<endl;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(dis[i] + max(disp[i] + disp[j], disq[i] + disq[j]) + dis[j] > T) continue;
// cout<<i<<" "<<j<<" "<<dis[i]<<" "<<max(disp[i] + disp[j], disq[i] + disq[j])<<" "<<dis[j]<<endl;
// cout<<disp[i]<<" + "<<disp[j] <<" "<<disq[i] <<" + "<<disq[j] <<endl;
ans = max(ans, T - max(disp[i] + disp[j], disq[i] + disq[j]));
}
}
cout<<ans<<endl;
return 0;
}