結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-07-22 13:06:54 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,308 bytes |
| コンパイル時間 | 1,002 ms |
| コンパイル使用メモリ | 84,612 KB |
| 実行使用メモリ | 10,756 KB |
| 最終ジャッジ日時 | 2024-10-07 02:02:45 |
| 合計ジャッジ時間 | 2,886 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 7 WA * 19 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
using namespace std;
typedef long long ll;
typedef pair<ll,int> P;
class Edge
{
public:
int to;
ll cost;
Edge(int t,ll c)
{
to=t;
cost=c;
}
};
vector<Edge> g[2000];
ll d[3][2000];//0...0から 1...pから 2...qから
void dijk(int s,int n,int mode)
{
priority_queue<P,vector<P>,greater<P>> q;
d[mode][s]=0;
q.push(P(0,s));
while(!q.empty())
{
P p=q.top();q.pop();
if(p.first>d[mode][p.second])
continue;
for(int i=0;i<g[p.second].size();i++)
{
Edge e=g[p.second][i];
if(p.first+e.cost<d[mode][e.to])
{
d[mode][e.to]=p.first+e.cost;
q.push(P(d[mode][e.to],e.to));
}
}
}
return;
}
int main()
{
int n,m,p,q,t;
ll ans=-1;
cin>>n>>m>>p>>q>>t;
p--;q--;
fill(d[0],d[3],1e15-1);
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
a--;b--;
g[a].push_back(Edge(b,c));
g[b].push_back(Edge(a,c));
}
dijk(0,n,0);
dijk(p,n,1);
dijk(q,n,2);
//中間ノードの位置を全探索
for(int i=0;i<n;i++)
{
if((d[0][i]+max(d[1][i],d[2][i]))*2>t)
continue;
ans=max(t-max(d[1][i],d[2][i])*2,ans);
}
//全部通って間に合う場合を考える
if(min(d[0][p]+d[1][q]+d[2][0],d[0][q]+d[2][p]+d[1][0])<=t)
ans=t;
cout<<ans<<endl;
return 0;
}