Submission #596397

#TimeUsernameProblemLanguageResultExecution timeMemory
596397ziduoCities (BOI16_cities)C++14
100 / 100
1923 ms45008 KiB
#include<bits/stdc++.h> using namespace std; int n, m, k, must[7]; vector<pair<int, int>> edges[100000]; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >>n>>k>>m; long long dp[(1<<k)][n]; for(int i=0; i<(1<<k); i++) for(int j=0; j<n; j++) dp[i][j] = 100000000000000000LL; for(int i=0; i<k; i++){ int v; cin >> v; v--; dp[1<<i][v] = 0; } for(int i=0; i<m; i++){ int a,b,c; cin>>a>>b>>c; edges[a-1].push_back({b-1,c}); edges[b-1].push_back({a-1,c}); } for(int i=1; i<(1<<k); i++){ for(int j=0; j<i; j++){ if((i|j)!=i)continue; for(int v=0; v<n; v++) dp[i][v] = min(dp[i][v], dp[j][v]+dp[i^j][v]); } priority_queue<pair<long long, int>> que; bool visit[n]; for(int i=0; i<n; i++)visit[i] = false; for(int j=0; j<n; j++) if(dp[i][j]!=1000000000000000000LL) que.push({-dp[i][j], j}); while(!que.empty()){ pair<long long, int> q = que.top(); que.pop(); if(visit[q.second])continue; visit[q.second]=true; for(auto p: edges[q.second]){ if(dp[i][p.first]>-q.first+p.second){ dp[i][p.first]= -q.first+p.second; que.push({-dp[i][p.first], p.first}); } } } } long long ans = 1000000000000000000LL; for(int i=0; i<n; i++) ans = min(ans, dp[(1<<k)-1][i]); cout<<ans<<endl; }
#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...