結果
| 問題 |
No.1812 Uribo Road
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-01-15 16:48:04 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 130 ms / 5,000 ms |
| コード長 | 4,951 bytes |
| コンパイル時間 | 5,237 ms |
| コンパイル使用メモリ | 281,472 KB |
| 最終ジャッジ日時 | 2025-01-27 12:35:39 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
#include <atcoder/all>
using namespace atcoder;
#include <bits/stdc++.h>
#define all(a) (a.begin()),(a.end())
#define rall(a) (a.rbegin()),(a.rend())
using namespace std;
using ll=long long;
using ld=long double;
using pll=pair<ll,ll>;
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;}
istream& operator >> (istream& is, modint1000000007& x) { unsigned int t; is >> t; x=t; return is; }
istream& operator >> (istream& is, modint998244353& x) { unsigned int t; is >> t; x=t; return is; }
istream& operator >> (istream& is, modint& x) { unsigned int t; is >> t; x=t; return is; }
ostream& operator << (ostream& os, const modint1000000007& x) { os << x.val(); return os; }
ostream& operator << (ostream& os, const modint998244353& x) { os << x.val(); return os; }
ostream& operator << (ostream& os, const modint& x) { os << x.val(); return os; }
template<class T1, class T2>istream& operator >> (istream& is, pair<T1,T2>& p) { is >> p.first >> p.second; return is; }
template<class T1, class T2>ostream& operator << (ostream& os, const pair<T1,T2>& p) { os << p.first << " " << p.second; return os;}
template<class T>istream& operator >> (istream& is, vector<T>& v) { for(T& x:v) is >> x; return is; }
template<class T>ostream& operator << (ostream& os, const vector<T>& v) {for(int i=0;i<(int)v.size();i++) {os << v[i] << (i+1 == v.size() ? "":" ");} return os;}
template<class... A> void pt() { std::cout << "\n"; }
template<class... A> void pt_rest() { std::cout << "\n"; }
template<class T, class... A> void pt_rest(const T& first, const A&... rest) { std::cout << " " << first; pt_rest(rest...); }
template<class T, class... A> void pt(const T& first, const A&... rest) { std::cout << first; pt_rest(rest...); }
template<typename V, typename H> void resize(vector<V>& vec, const H head){ vec.resize(head); }
template<typename V, typename H, typename ... T> void resize(vector<V>& vec, const H& head, const T ... tail){ vec.resize(head); for(auto& v: vec) resize(v, tail...); }
template<typename V, typename T> void fill(V& x, const T& val){ x = val; }
template<typename V, typename T> void fill(vector<V>& vec, const T& val){ for(auto& v: vec) fill(v, val); }
template<typename H> void vin(istream& is, const int idx, vector<H>& head){ is >> head[idx]; }
template<typename H, typename ... T> void vin(istream& is, const int idx, vector<H>& head, T& ... tail){ vin(is >> head[idx], idx, tail...); }
template<typename H, typename ... T> void vin(istream& is, vector<H>& head, T& ... tail){ for(int i=0; i<(int)head.size(); i++) vin(is, i, head, tail...); }
template<typename H, typename ... T> void vin(vector<H>& head, T& ... tail){ vin(cin, head, tail...); }
map<ll,ll>divisor(ll n){map<ll,ll>res;for(ll i=1;i*i<=n;i++)if(n%i==0){res[i]++;res[n/i]++;}return res;}
map<ll,ll>factrization(ll n){map<ll,ll>res;for(ll i=2;i*i<=n;i++)while(n%i==0){res[i]++;n/=i;}if(n>1)res[n]++;return res;}
static const ll inf=1e18+7;
static const ld pi=acos(-1);
static const ld eps=1e-10;
using v1=vector<ll>;
using v2=vector<v1>;
using v3=vector<v2>;
using v4=vector<v3>;
using S=pll;
S op(S a,S b){return max(a,b);}
S e(){return {-inf,-inf};}
class Edge {
public:
ll t,w;
Edge(){}
Edge(ll t,ll w): t(t),w(w){}
};
v1 dijkstra(ll s,vector<vector<Edge>>g) {
ll n=g.size();
v1 d(n,inf);
priority_queue<pll,vector<pll>,greater<>>q;
d[s]=0;
q.push({0,s});
while(q.size()){
ll u=q.top().second;
ll du=q.top().first;
q.pop();
if(d[u]<du) continue;
for(ll i=0;i<g[u].size();i++){
Edge e=g[u][i];
if(chmin(d[e.t],du+e.w))q.push({du+e.w, e.t});
}
}
return d;
}
int main(void) {
cin.tie(nullptr);
ios::sync_with_stdio(false);
ll N,M,K;cin>>N>>M>>K;
vector<vector<Edge>>g(N);
set<ll>s;
for(ll i=0;i<K;i++){ll r;cin>>r;r--;s.insert(r);}
v2 es;
for(ll i=0;i<M;i++){
ll a,b,c;cin>>a>>b>>c;a--;b--;
if(a>b)swap(a,b);
if(s.find(i)!=s.end())es.push_back({a,b,c});
g[a].push_back({b,c});
g[b].push_back({a,c});
}
v3 d;resize(d,K,2,N);
for(ll i=0;i<K;i++){
ll a=es[i][0],b=es[i][1];
d[i][0]=dijkstra(a,g);
d[i][1]=dijkstra(b,g);
}
v3 dp;resize(dp,1<<K,K,2);fill(dp,inf);
for(ll i=0;i<K;i++)for(ll j=0;j<2;j++){
ll w=es[i][2];
ll cost=min(d[i][j][0]+w*2,d[i][!j][0]+w);
dp[1<<i][i][j]=cost;
}
for(ll S=0;S<1<<K;S++){
for(ll i=0;i<K;i++){
if(!(S>>i&1))continue;
for(ll j=0;j<K;j++){
if(S>>j&1)continue;
for(ll k=0;k<2;k++){
for(ll l=0;l<2;l++){
ll s=es[i][k];
ll w=es[j][2];
ll cost=min(d[j][l][s]+w*2,d[j][!l][s]+w);
chmin(dp[S|1<<j][j][l],dp[S][i][k]+cost);
}
}
}
}
}
ll ans=inf;
for(ll i=0;i<K;i++)for(ll j=0;j<2;j++)chmin(ans,dp[(1<<K)-1][i][j]+d[i][j][N-1]);
pt(ans);
}