ABC054

だいぶ久しぶりの投稿…。全然習慣化できてないなー。

C問題をやってみて解けなかったっていうのもある。

今回は解答例を丸写しなのでご容赦を(__)

#include <bits/stdc++.h>
using namespace std;

const int nmax = 8;
bool graph[nmax][nmax];

int dfs(int v,int n,bool visited[nmax]){
 bool all_visited =true;

 for(int i=0;i<n;i++){
   if(visited[i]==false)
     all_visited =false;
 }
 if(all_visited){
   return 1;
 }

 int ret =0;

 for(int i=0;i<n;i++){
   if(graph[v][i]==false) continue;
   if(visited[i]) continue;

   visited[i]= true;
   ret += dfs(i,n,visited);
   visited[i]=false;
 }
 return ret;
}

int main(){
 int n,m;
 cin >> n >> m;

 for(int i=0;i<m;i++){
   int a, b;
   cin >> a >> b;
   graph[a-1][b-1] = graph[b-1][a-1] = true;
 }

 bool visited[nmax];
 for(int i=0;i<n;i++){
   visited[i]=false;
 }

 visited[0]=true;
 cout << dfs(0,n,visited) << endl;
 return 0;

}

言われてみると、あー、ってなるんだけど、DFSってまだ慣れない。

頂点同士の関係と通過済みかどうかをそれぞれboolで管理して、っていう流れを、もうそういうパターンとして引き出せるようにするしかないな。

下の部分、探索を進めていって行き詰った後に、通過済み(visited)をfalseに戻すっていうのが、個人的なるほどポイント!

あとは、探索した結果、すべて通過済みにならなければ、retをそのまま0で返す、このretを0で返すのを書き忘れてしまいそう…。

 int ret =0;

 for(int i=0;i<n;i++){
   if(graph[v][i]==false) continue;
   if(visited[i]) continue;

   visited[i]= true;
   ret += dfs(i,n,visited);
   visited[i]=false;
 }
 return ret;

丸写しでも毎日投稿!数をこなす!精進あるのみ!

わかりやすく華麗に解説もできるようになれたらいいな。

以上!