제출 #755692

#제출 시각아이디문제언어결과실행 시간메모리
755692Ahmed57Cities (BOI16_cities)C++17
100 / 100
3801 ms52572 KiB
#pragma GCC optimize("Ofast") #include <bits/stdc++.h> using namespace std; long long lol[5][200001]; vector<int> imp;int n,k,m; vector<pair<int,int>> adj[200001]; void d(int st){ priority_queue<pair<long long,long long>> q1; q1.push({0,imp[st]}); lol[st][imp[st]] = 0; while(!q1.empty()){ long long co = q1.top().first*-1; long long no = q1.top().second; q1.pop(); if (co>lol[st][no]) continue ; for(auto i:adj[no]){ if(lol[st][i.first]>(i.second+co)){ lol[st][i.first] = (i.second+co); q1.push({lol[st][i.first]*-1,i.first}); } } } } long long calc(){ long long cost[n+1][(1<<k)]; memset(cost,0,sizeof cost); for(int i = 1;i<=n;i++){ for(int j = 0;j<(1<<k);j++){ cost[i][j] = 1e18; } } for(int i = 1;i<=n;i++){ cost[i][0] = 0; } for(int le = 0;le<(1<<k)-1;le++){ priority_queue<pair<long long,int>> q1; for(int i = 1;i<=n;i++){ q1.push({(-1)*cost[i][le],i}); } while(!q1.empty()){ long long co = q1.top().first*-1; int no = q1.top().second; q1.pop(); if (co>cost[no][le]) continue ; for(int submask = 0;submask<(1<<k);submask++){ if((le&submask)!=0)continue; int nemask = (submask|le); long long necost = co; for(int j = 0;j<k;j++){ if(submask&(1<<j)){ necost+=lol[j][no]; } } for(auto i:adj[no]){ if(cost[i.first][nemask]>(necost+i.second)){ cost[i.first][nemask]=(necost+i.second); if(submask==0)q1.push({cost[i.first][nemask]*-1,i.first}); } } } } } long long ans = 1e18; for(int i = 1;i<=n;i++){ ans = min(ans,cost[i][(1<<k)-1]); } return ans; } signed main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>k>>m; for(int i = 1;i<=n;i++){ adj[i].push_back({i,0}); } for(int i= 0;i<k;i++){ int x;cin>>x; imp.push_back(x); } for(int i = 0;i<m;i++){ int a,b,c;cin>>a>>b>>c; adj[a].push_back({b,c}); adj[b].push_back({a,c}); } for(int i = 0;i<k;i++){ for(int j = 1;j<=n;j++)lol[i][j] = 1e18; d(i); } cout<<calc()<<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...