제출 #1245763

#제출 시각아이디문제언어결과실행 시간메모리
1245763trandangquangCities (BOI16_cities)C++20
100 / 100
1515 ms40608 KiB
#include<bits/stdc++.h> using namespace std; #define FOR(i,a,b) for(int i=(a); i<=(b); ++i) #define ii pair<int,int> #define fi first #define se second #define eb emplace_back #define ll long long const int N=1e5+5; int n,k,m,p[N]; ll dp[N][1<<5]; vector<ii> adj[N]; void dijkstra(int x){ priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq; FOR(i,1,n) pq.push({dp[i][x],i}); while(pq.size()){ auto [du,u]=pq.top(); pq.pop(); if(du>dp[u][x]) continue; for(auto [v,w]:adj[u]){ if(dp[v][x]>dp[u][x]+w){ dp[v][x]=dp[u][x]+w; pq.push({dp[v][x],v}); } } } } int main(){ cin.tie(0)->sync_with_stdio(0); cin>>n>>k>>m; FOR(i,0,k-1) cin>>p[i]; FOR(i,1,m){ int x,y,z; cin>>x>>y>>z; adj[x].eb(y,z); adj[y].eb(x,z); } memset(dp,0x3f,sizeof(dp)); FOR(i,0,k-1) dp[p[i]][1<<i]=0; FOR(mask,0,(1<<k)-1){ for(int sub=mask; sub; sub=(sub-1)&mask){ FOR(i,1,n){ dp[i][mask]=min(dp[i][mask],dp[i][sub]+dp[i][mask^sub]); } } dijkstra(mask); } ll res=1e18; FOR(i,1,n) res=min(res,dp[i][(1<<k)-1]); cout<<res<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...