제출 #641074

#제출 시각아이디문제언어결과실행 시간메모리
641074kith14Cities (BOI16_cities)C++17
36 / 100
319 ms32448 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define db double #define pairll pair<ll,ll> #define lpairll pair<ll,pairll> #define repp(i,a,b) for (ll i = a; i <= b; i++) #define repz(i,a,b) for (ll i = a; i < b; i++) #define repm(i,a,b) for (ll i = a; i >= b; i--) #define fr first #define sc second #define mp make_pair #define pb push_back const ll N = 1e5+5, MOD = 1e9+7, M = 2e5+5; ll tc = 1, n, m, ar[N], used[25]; ll x, y, k, dis[N][5]; string s, s1, s2, ye = "YES", no = "NO"; vector<lpairll> ed[N]; vector<lpairll> V; vector<ll> pk[5]; ll xr[M], wr[M], yr[M], pr[25]; void input(){ cin >> n >> k >> m; repp(i,1,k) cin >> ar[i], used[ar[i]] = 1; repp(i,1,m){ ll x, y, w; cin >> xr[i] >> yr[i] >> wr[i]; x = xr[i], y = yr[i], w = wr[i]; ed[x].pb(mp(y,mp(w,i))); ed[y].pb(mp(x,mp(w,i))); V.pb(mp(w,mp(x,y))); } } ll fir(ll i){ if (i == pr[i]) return i; return pr[i] = fir(pr[i]); } bool merge(ll a, ll b){ a = fir(a), b = fir(b); if (a == b) return 0; pr[a] = b; return 1; } void sub1(){ //create an mst with the nodes that are active vector<ll> act; repp(i,1,n){ if (!used[i]) act.pb(i); } ll sz = act.size(), ans = 4e18; repp(i,0,(1<<sz)){ repz(j,0,sz){ if((1<<j)&i) used[act[j]] = 1; else used[act[j]] = 0; } // cout << "i = " << i << endl; // repp(j,1,n){ // cout << j << " " << used[j] << endl; // } ll cur = 0; repp(j,1,n) pr[j] = j; for (auto j : V){ ll w = j.fr, x = j.sc.fr, y = j.sc.sc; if (!used[x] || !used[y]) continue; if(merge(x,y)) cur += w; } // repp(j,1,n){ // cout << j << " " << fir(j) << endl; // } bool imp = 0; repp(j,1,k){ imp |= (fir(ar[j]) != fir(ar[1])); } if (imp) continue; ans = min(ans,cur); } cout << ans << endl; } void subk2(ll st, ll fn, ll cr){ repp(i,1,n) dis[i][cr] = 4e18; dis[ar[st]][cr] = 0; priority_queue<pairll,vector<pairll>,greater<pairll> > pq; pq.push(mp(0,ar[st])); while(pq.size()){ pairll a = pq.top(); pq.pop(); for (auto i : ed[a.sc]){ ll nxidx = i.fr, w = i.sc.fr; if (dis[nxidx][cr] > dis[a.sc][cr]+w){ dis[nxidx][cr] = dis[a.sc][cr]+w; pq.push(mp(dis[nxidx][cr],nxidx)); } } } } void subk3(){ subk2(1,2,1); subk2(2,3,2); subk2(3,1,3); ll ans = 4e18; repp(xex,1,n){ ll cur = 0; repp(pep,1,3){ cur += dis[xex][pep]; } ans = min(ans,cur); } cout << ans << endl; } void solve(){ if (n <= 20 && m <= 40){ sort(V.begin(),V.end()); sub1(); } else if (k == 2){ subk2(1,2,1); cout << dis[ar[2]][1] << endl; } else if (k == 3){ subk3(); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); //cin >> tc; while(tc--){ input(); solve(); } }
#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...