競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 252E

ABC252E

Dijikstra tree を求める問題. Dijikstra 法は,最短経路を求めるアルゴリズムよりも高性能で, 最短木を求めるアルゴリズム である.

実装
普通に Dijikstra をして,直前の遷移するときの edge を記録しておけば Dijikstra tree が手に入る.

注意: 遷移したとき, \(if(dis[cu] != cd) continue; \) を入れないと TLE.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

struct Edge{
  ll to, cost, id;
  Edge(ll to, ll cost , ll id) : to(to), cost(cost), id(id){}
};

int main() {
  ll n, m ;
  cin >> n >> m;
 
  vector<vector<Edge>> ed(m);
  rep(i,m){
    ll a,b,c; cin >> a >> b >> c;
    --a, --b;
    ed[a].push_back(Edge(b,c,i));
    ed[b].push_back(Edge(a,c,i));
  }

  min_priority_queue<pll> q;

  vll ans(n,-1);
  vll dis(n, INFL);

  q.push({0,0});
  chmin(dis[0], 0LL);
 
  while(q.size()){
    auto [cd, cv] = q.top(); q.pop();
    if(dis[cv] != cd) continue; // 無いと TLE

    for(auto [nv, nco, ni] : ed[cv]){
      ll nd = cd + nco;
      if(chmin(dis[nv], nd)){
        q.push({nd, nv});
        ans[nv] = ni;
      }
    }
   
  }

  srep(i,1,n){
    cout << ans[i]+1 << endl;
  }


  return 0;
}