제출 #957144

#제출 시각아이디문제언어결과실행 시간메모리
957144Jawad_Akbar_JJCities (BOI16_cities)C++17
51 / 100
4452 ms50056 KiB
#pragma GCC optimize("O2") #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #include <iostream> #include <vector> #include <set> using namespace std; #define int long long const int N = 1.1e5; vector<pair<int,int>> nei[N]; int dp[N][33]; int sp[10],n,m,k; void dijkstra(int ind){ for (int i=1;i<N;i++) dp[i][1<<ind] = 1e17; dp[sp[ind]][1<<ind] = 0; set<pair<int,int>> st; st.insert({0,sp[ind]}); while (st.size() > 0){ int u = (*begin(st)).second; st.erase(begin(st)); for (auto [i,c] : nei[u]){ if (dp[i][1<<ind] > dp[u][1<<ind] + c){ dp[i][1<<ind] = dp[u][1<<ind] + c; st.insert({dp[i][1<<ind],i}); } } } } void calc(int msk){ for (int smsk = 0;smsk <= msk;smsk ++){ if ((msk | smsk) != msk) continue; for (int u=1;u<=n;u++){ dp[u][msk] = min(dp[u][msk],dp[u][msk - smsk] + dp[u][smsk]); for (auto [i,c] : nei[u]){ dp[u][msk] = min(dp[u][msk],dp[u][smsk] + dp[i][msk - smsk] + c); dp[u][msk] = min(dp[u][msk],dp[i][smsk] + dp[i][msk - smsk] + c); } } } } signed main(){ // ios_base::sync_with_stdio(false); // cin.tie(NULL); // cout.tie(NULL); cin>>n>>k>>m; for (int i=1;i<=k;i++) cin>>sp[i-1]; for (int i=1;i<=m;i++){ int a,b,c; cin>>a>>b>>c; nei[a].push_back({b,c}); nei[b].push_back({a,c}); } for (int i=1;i<=n;i++) for (int j=1;j<32;j++) dp[i][j] = 1e17; for (int i=1;i<=k;i++) dijkstra(i-1); for (int i=0;i<32;i++){ if (__builtin_popcount(i) == 2) calc(i); } for (int i=0;i<32;i++){ if (__builtin_popcount(i) == 3) calc(i); } for (int i=0;i<32;i++){ if (__builtin_popcount(i) == 4) calc(i); } for (int i=0;i<32;i++){ if (__builtin_popcount(i) == 5) calc(i); } int Ans = 1e17; for (int i=1;i<=n;i++) Ans = min(Ans,dp[i][(1<<k) - 1]); 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...