B - レ/V Editorial by TKTY1

DFS解法

 \(i\)\(i+1\) の間にレ点があるなら \(i\to i+1\) と辺を張ったグラフ上でDFS等をして答えを求めることができます.計算量は \(O(N)\) です.

#include<bits/stdc++.h>
using namespace std;
void dfs(int&u,vector<vector<int>>&x,vector<bool>&ok){
  ok[u]=true;
  for(auto v:x[u]){
    dfs(v,x,ok);
  }
  cout<<u+1<<" ";
}
int main(){
  int n,m;
  cin>>n>>m;
  vector<int>a(m);
  for(int i=0;i<m;i++)cin>>a[i];
  for(int i=0;i<m;i++)a[i]--;
  vector<vector<int>>x(n);
  for(auto i:a){
    x[i].push_back(i+1);
  }
  vector<bool>ok(n,false);
  for(int i=0;i<n;i++)if(!ok[i])dfs(i,x,ok);
}

posted:
last update: