結果
| 問題 | No.1812 Uribo Road |
| コンテスト | |
| ユーザー |
Chanyuh
|
| 提出日時 | 2022-01-27 12:31:01 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 643 ms / 5,000 ms |
| コード長 | 3,630 bytes |
| 記録 | |
| コンパイル時間 | 1,814 ms |
| コンパイル使用メモリ | 139,076 KB |
| 最終ジャッジ日時 | 2025-01-27 15:32:58 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
#include<iostream>
#include<array>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
#include<tuple>
#include<cassert>
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
const ll INF = (ll)1000000007 * 1000000007;
typedef pair<int, int> P;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define Per(i,sta,n) for(int i=n-1;i>=sta;i--)
typedef long double ld;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ll, ll> LP;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
template<class T>bool chmax(T &a, const T &b) {if(a<b){a=b;return 1;}return 0;}
template<class T>bool chmin(T &a, const T &b) {if(b<a){a=b;return 1;}return 0;}
template <typename T>
struct Dijkstra{
struct Edge{
int to;
T cost;
Edge(int to,T cost):to(to),cost(cost){}
bool operator<(const Edge &o)const{return cost>o.cost;}
};
const T inf = (numeric_limits<T>::max())/2;//infを設定する
vector<vector<Edge>> G;
vector<T> ds;
vector<int> bs;
Dijkstra(int n):G(n){}
void add_edge(int u,int v,T c){
G[u].push_back(Edge(v,c));
}
void build(vector<int> &ss){
int n=G.size();
ds.assign(n,inf);
bs.assign(n,-1);
priority_queue<Edge> pq;
for(int s:ss) {
ds[s]=0;
pq.emplace(s,ds[s]);
}
while(!pq.empty()){
auto p=pq.top();pq.pop();
int v=p.to;
if(ds[v]<p.cost) continue;
for(auto e:G[v]){
if(ds[e.to]>ds[v]+e.cost){
ds[e.to]=ds[v]+e.cost;
bs[e.to]=v;
pq.emplace(e.to,ds[e.to]);
}
}
}
}
void build(int s){
vector<int> v={s};
build(v);
}
T operator[](int k){return ds[k];}
vector<int> restore(int to){
vector<int> res;
if(bs[to]<0) return res;
while(~to) res.emplace_back(to),to=bs[to];
reverse(res.begin(),res.end());
return res;
}
};
int n,m,k;
int a[20010],b[20010];ll c[20010];
int r[20];
vector<vector<ll>> D;
ll dp[10010][10010];
void solve(){
cin >> n >> m >> k;
Dijkstra<ll> dij(n);
rep(i,k) {
cin >> r[i];
r[i]--;
}
rep(i,m){
cin >> a[i] >> b[i] >> c[i];a[i]--;b[i]--;
dij.add_edge(a[i],b[i],c[i]);
dij.add_edge(b[i],a[i],c[i]);
}
D.resize(n);
dij.build(0);D[0]=dij.ds;
dij.build(n-1);D[n-1]=dij.ds;
rep(i,k){
//cout << i << endl;
if(D[a[r[i]]].size()<n){
dij.build(a[r[i]]);
D[a[r[i]]]=dij.ds;
}
if(D[b[r[i]]].size()<n){
dij.build(b[r[i]]);
D[b[r[i]]]=dij.ds;
}
}
int U=(1<<k);
rep(S,U){
rep(i,n) dp[S][i]=INF;
}
dp[0][0]=0;
rep(S,U){
rep(j,k){
if(S&(1<<j)) continue;
rep(i,n){
chmin(dp[S|(1<<j)][a[r[j]]],dp[S][i]+D[b[r[j]]][i]+c[r[j]]);
chmin(dp[S|(1<<j)][b[r[j]]],dp[S][i]+D[a[r[j]]][i]+c[r[j]]);
}
}
}
ll ans=INF;
rep(i,n) chmin(ans,dp[U-1][i]+D[n-1][i]);
cout << ans << endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << fixed << setprecision(50);
solve();
}
Chanyuh