최근 인터넷에서 DFS를 인접 목록으로 실행하는 방법을 찾으려고했지만을 올바르게 검색하는 방법을 찾지 못했습니다. 온라인에서 찾을 수있는 가장 좋은 예는 Find connected components in a graph 이지만 첫 번째 방법을 사용하면 작동하지 않는 것으로 보입니다. 다른 방법을 시도 할만큼 노조/세트가 자신감이 부족합니다.DFS를 사용하여 그래프 (adja)에서 연결된 구성 요소 찾기
가장자리에 포함 된 구조체입니다 (무시 test_vector
및 cc
, 나는 작동하도록 cc_count
를 얻기에 집중하고있어) :
struct edge{
int to; //copy of to_original (dont worry about this it's for a different functionality)
int w; //weight of edge
int from_original; //from vertex
int to_original; //to vertex
}
을 어딘가에 INT 주의 : 이것은 내가 지금까지 무엇을 가지고
cout << "conn: " << connected(adjA, test_vector) << endl;
int connected(vector<list<edge>> &adjA, vector<short int> &cc){
int v_size = adjA.size();
vector<bool> discovered(false,v_size);
int cc_count = 0;
for(unsigned int u = 0; u < adjA.size(); u++){
if(!discovered[u]){
cout << u << endl;
discovered[u] = true;
cc_count+=1;
dfs(adjA,discovered,cc,cc_count,u);
}
}
return cc_count;
}
void dfs(vector<list<edge>>&adjA, vector<bool> &discovered, vector<short int> &cc, int &cc_count,int u){
for(unsigned int v = 0; v < adjA[u].size();v++){
if(!discovered[v]){
cout << v << endl;
discovered[v] = true;
dfs(adjA, discovered,cc,cc_count,v);
}
}
}
cout << v << endl;
및 cout << u << endl
에서 모든 노드를 한 번 방문 할 수 있다는 것을 보여줍니다. 그러나, 나는 cc_count
을 잘못 증가시키고 있다고 생각합니다. 이 인접리스트에 :
0->[1]->[3]->[5]
1->[0]->[2]->[3]->[4]
2->[1]->[4]
3->[0]->[1]->[4]->[5]
4->[1]->[2]->[3]->[5]->[6]
5->[0]->[3]->[4]->[6]
6->[4]->[5]
프로그램 출력 :
0
1
2
3
4
5
6
conn: 7
전체 그래프는 단일 성분이므로 CONN는 1이어야한다. 나는 이것이 잘못된 방향으로 가고있는 것처럼 느낍니다. 내가해야 할 변화가 있습니까? DFS 또는 BFS를 사용하여 더 나은 방법이 있습니까?
잘못된 형식에 대해 사과드립니다. 스택 오버플로 오류를 해결하기 위해 거의 한 시간 만 노력했습니다. 귀하의 dfs
방법은 모든 가장자리에보고되지
입니다해야합니다. –
ok, 그래서'edge'는 양쪽 끝점을 제공합니다. 'u'가 아닌'v'라는 이름을 사용하고 이전 코드를 사용하면됩니다. – m8mble