2017-10-18 53 views
-2

這樣的DFS功能可按代碼片段: -我不理解的語法這DFS實現

void dfs(int u, int p) 
      { 
       if(p!=-1)d[u] = d[p]+1; 
       for(int i: v[u]) 
       { 
        if(i==p)continue; 
        dfs(i, u); 
       } 
      } 

我不理解這其中的DFS排在比賽的社論執行。完整的代碼是follows.it將是非常好的,如果有人可以幫助我理解這一段代碼

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

     vector<int> d; 
     vector< vector<int> > v; 

     void dfs(int u, int p) 
     { 
      if(p!=-1)d[u] = d[p]+1; 
      for(int i: v[u]) 
      { 
       if(i==p)continue; 
       dfs(i, u); 
      } 
     } 

#undef int 
int main() 
{ 
#define int long long int 
ios_base::sync_with_stdio(0); 
cin.tie(0); 
cout.tie(0); 

int n; 
cin>>n; 
v.resize(n); 
d.resize(n); 
for(int i = 0;i<n-1;i++) 
{ 
    int x, y; 
    cin>>x>>y; 
    v[x-1].push_back(y-1); 
    v[y-1].push_back(x-1); 
} 
d[0] = 0; 
dfs(0, -1); 
int q; 
cin>>q; 
while(q--) 
{ 
    int x, y; 
    cin>>x>>y; 
    if((d[x-1]+d[y-1])&1)cout<<"Odd"<<endl; 
    else cout<<"Even"<<endl; 
} 


return 0; 

}

+5

代碼中寫的不好,沒有人真正應該使用快速黑客替換for-loop代碼學習材料。案例:用宏重新定義一種基本的內置類型; [包括''](http://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h);命名錯誤的變量;沒有文件或評論。如果你想學習編程C++,那麼[閱讀好書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)或去學校。 –

+0

沒有什麼像重新定義關鍵字那樣激發你的代碼。接下來'#define double float' –

+0

@Someprogrammerdude幾天前,我正在審查一些考試試卷,以便在我們的辦公室進行新一期招聘。我感到驚訝的是,每個人都包含'bits/stdC++。h'。我問了其他人,現在主要關注的是哪些書,我的一位年輕同事回答說'Code :: Blocks'自動生成這個。 – taskinoor

回答

0

這是標準的DFS代碼。

根的父母是-1。所以在其他情況下,我們會有一位家長。

對於所有那些節點,我們將訪問它的鄰居。

  for(int i: v[u]) // every neighbor of u except the parent. 
      { 
       if(i==p)continue; // avoiding the parent from which it is traversed 
       dfs(i, u); // recursively search there. 
      } 

如果你有興趣正在使​​用你可以試試這個reference C++語言的細節。

也有更多可讀的方式來做同樣的事情。但是在競爭性編碼的情況下,由於編碼部分的時間限制而不被接受。這就是爲什麼它是瞭解任何良好做法的不好的地方。

你還可以用像提交「constest」網站或「網上評委」往往這

for(int neighborNodeIndx = 0 ; neighborNodeIndx < (int)v[u].size(); neighborNodeIndx ++) 
    { 
     neighborNode = v[u][neighborNodeIndx];// this is similar to i 
     ... 
    } 
+0

謝謝@coderredoc –