답안 #640644

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
640644 2022-09-15T04:21:44 Z christinelynn Cities (BOI16_cities) C++17
22 / 100
136 ms 35684 KB
#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;
ll tc = 1, n, m, ar[N], br[N], used[N];
ll x, y, k;
string s, s1, s2, ye = "YES", no = "NO";
vector<pairll> v, ed[N];
vector<lpairll> V;

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 >> x >> y >> w;
    ed[x].pb(mp(y,w));
    ed[y].pb(mp(x,w));
    V.pb(mp(w,mp(x,y)));
  }
}

ll pr[N];

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 = 1e18;
  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 dis[n+5];
  repp(i,1,n) dis[i] = 1e18;
  dis[ar[1]] = 0;
  priority_queue<pairll,vector<pairll>,greater<pairll> > pq;
  pq.push(mp(0,ar[1]));
  while(pq.size()){
    pairll a = pq.top();
    pq.pop();
    for (auto i : ed[a.sc]){
      ll nxidx = i.fr, w = i.sc;
      if (dis[nxidx] > dis[a.sc]+w){
        dis[nxidx] = dis[a.sc]+w;
        pq.push(mp(dis[nxidx],nxidx));
      }
    }
  }
  cout << dis[ar[2]] << endl;
}

void solve(){
  if (n <= 20 && m <= 40){
    sort(V.begin(),V.end());
    sub1();
  }
  else if (k == 2){
    subk2();
  }
  else if (k == 3){
    assert(0);
  }
}

int main(){
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  //cin >> tc;
  while(tc--){
    input();
    solve();
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Correct 78 ms 2672 KB Output is correct
3 Correct 41 ms 2672 KB Output is correct
4 Correct 24 ms 2644 KB Output is correct
5 Correct 14 ms 2692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 112 ms 35684 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2772 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 118 ms 17732 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 136 ms 17676 KB Output isn't correct
2 Halted 0 ms 0 KB -