C++계산 그림 의 임의의 두 점 사이 의 모든 경로

7916 단어 C++경로
연결 도 를 바탕 으로 인접 행렬 이 실현 하 는 그림 은 재 귀적 으로 실현 되 지 않 는 다.
알고리즘 사상:
두 개의 표지 위 치 를 설정 하고 ① 이 정점 이 스 택 에 들 어 갈 지 여부,② 이 정점 과 인접 한 정점 에 접근 하 였 는 지 여부.
  A.시작 점 플래그 위 치 를 ① 1 로 설정 하고 스 택 에 넣 습 니 다.
  B.스 택 꼭대기 노드 V 가 그림 에서 도착 할 수 있 고 스 택 에 들 어가 지 않 았 으 며 이 노드 V 에서 출발 하여 방문 한 노드 가 없 는 지 확인 합 니 다.
  C.있 으 면 찾 은 이 노드 를 스 택 에 들 어 갑 니 다.이 정점 의 표지 위 치 는 ① 1,V 에 대응 하 는 이 정점 의 표지 위 치 는 ② 1 입 니 다.
  D.없 으 면 V 스 택 을 나 가 고 v 와 인접 한 모든 노드 를 방문 하지 않 은 것 으로 설정 합 니 다.즉,모든 플래그 위치 ② 0 을 설정 합 니 다.
  E.스 택 꼭대기 요소 가 종점 일 때 종점 에 접근 하지 않 았 습 니 다.즉,① 0 을 설치 하고 스 택 에 있 는 요 소 를 인쇄 하 며 스 택 꼭대기 노드 를 팝 업 합 니 다.
  F 스 택 에 요소 가 비어 있 을 때 까지 B C E 를 반복 합 니 다.
일단 예 를 들 어 볼 게 요.

간단 한 연결 도 를 가정 하면 그림 1 과 같다.만약 에 우리 가 결점 3 에서 결점 6 까지 의 모든 경 로 를 찾 으 려 면 우 리 는 결점 3 을 기점 으로 하고 결점 6 을 종점 으로 한다.결점 3 에서 결점 6 까지 의 모든 경 로 를 찾 는 절 차 는 다음 과 같다.
1.우 리 는 노드 를 저장 하 는 스 택 구 조 를 구축 하고 출발점 3 을 스 택 에 들 어가 서 노드 3 을 스 택 상태 로 표시 합 니 다.
2.결산 점 3 에서 출발 하여 결산 점 3 의 첫 번 째 비 입 스 택 에 방문 하지 않 은 이웃 노드 1 을 찾 아 결산 점 1 을 입 스 택 상태 로 표시 하고 3 에서 1 을 방문 한 것 으로 표시 합 니 다.
3.결산 점 1 에서 출발 하여 결산 점 1 의 첫 번 째 비 입 스 택 에 방문 하지 않 은 이웃 결산 점 0 을 찾 아 결산 점 0 을 입 스 택 상태 로 표시 하고 1 에서 0 을 방문 한 것 으로 표시 합 니 다.
4.결산 점 0 에서 출발 하여 결산 점 0 의 첫 번 째 비 입 스 택 에 방문 하지 않 은 인접 점 2 를 찾 아 결산 점 2 를 입 스 택 상태 로 표시 하고 0 에서 2 를 방문 한 것 으로 표시 합 니 다.
5.결산 점 2 에서 출발 하여 결산 점 2 의 첫 번 째 비 입 스 택 에 방문 하지 않 은 이웃 노드 5 를 찾 아 결산 점 5 를 입 스 택 상태 로 표시 하고 2 에서 5 를 방문 한 것 으로 표시 합 니 다.
6.결산 점 5 에서 출발 하여 결산 점 5 의 첫 번 째 비 입 스 택 에 방문 하지 않 은 이웃 노드 6 을 찾 아 결산 점 6 을 입 스 택 상태 로 표시 하고 5 에서 6 을 방문 한 것 으로 표시 합 니 다.
7.스 택 꼭대기 결산 점 6 이 종점 입 니 다.그러면 우 리 는 출발점 에서 종점 까지 의 경 로 를 찾 아 이 경 로 를 출력 합 니 다.
8.스 택 꼭대기 에서 결산 점 6 을 팝 업 하고 6 을 비 스 택 상태 로 표시 합 니 다.
9.현재 스 택 꼭대기 의 결산 점 은 5 이 고 결산 점 5 는 스 택 에 들 어가 지 않 고 방문 하지 않 는 결산 점 이 없 기 때문에 스 택 꼭대기 에서 결산 점 5 를 팝 업 하고 5 에서 6 을 방문 하지 않 은 것 으로 표시 합 니 다.
10、        현재 스 택 꼭대기 의 결산 점 은 2 이 고 결산 점 2 의 인접 노드 5 가 방문 되 었 습 니 다.6 은 비 입 스 택,비 방문 을 만족 시 키 면 우 리 는 결산 점 6 을 스 택 에 들 어 갈 것 입 니 다.
11、        현재 스 택 지붕 은 결산 점 6 이 고 두 번 째 경 로 를 찾 았 습 니 다.전체 스 택 을 출력 하 는 것 이 두 번 째 경로 입 니 다.
12、        8-11 절 차 를 반복 하면 출발점 3 에서 종점 6 까지 의 모든 경 로 를 찾 을 수 있 습 니 다.
13、        스 택 이 비어 있 고 알고리즘 이 끝 났 습 니 다.
C++코드 구현 에 대해 말씀 드 리 겠 습 니 다.
그림 클래스,인접 행렬 을 기반 으로 상세 하 게 쓰 지 않 음==

class Graph 
{ 
private: 
 CArray<DataType,DataType> Vertices; 
 int Edge[MaxVertices][MaxVertices]; 
 int numOfEdges; 
public: 
 Graph(); 
 ~Graph(); 
 void InsertVertex(DataType Vertex); 
 void InsertEdge(int v1,int v2,int weight); 
 int GetWeight(int i,int j); 
 int GetVertices(); 
 DataType GetValue(int i); 
};

먼저 자신 이 간단 한"창고 종류"를 쓰 는데,몇 가지 방법 이 추가 되 었 기 때문에 완전히 창고 라 고 부 르 지 는 않 는 다.

template<class T> 
class Stack 
{ 
private: 
 int m_size; 
 int m_maxsize; 
 T* data; 
public: 
 Stack(); 
 ~Stack(); 
 void push(T data); //   
 T pop(); //  ,         
 T peek(); //       
 bool isEmpty(); //      
 int getSize(); //          
 T* getPath(); //         
}; 
template<class T> 
Stack<T>::Stack() 
{ 
 m_size=0; 
 m_maxsize=100; 
 data=new T[m_maxsize]; 
} 
template<class T> 
Stack<T>::~Stack() 
{ 
 delete []data; 
} 
template<class T> 
T Stack<T>::pop() 
{ 
 m_size--; 
 return data[m_size]; 
} 
 
template<class T> 
void Stack<T>::push(T d) 
{ 
 if (m_size==m_maxsize) 
 { 
  m_maxsize=2*m_maxsize; 
  T* new_data=new T[m_maxsize]; 
  for (int i=0;i<m_size;i++) 
  { 
   new_data[i]=data[i]; 
  } 
  delete []data; 
  data=new_data; 
 } 
 data[m_size]=d; 
 m_size++; 
} 
 
template<class T> 
T Stack<T>::peek() 
{ 
 return data[m_size-1]; 
} 
 
template<class T> 
bool Stack<T>::isEmpty() 
{ 
 if (m_size==0) 
 { 
  return TRUE; 
 } 
 else 
 { 
  return FALSE; 
 } 
} 
 
template<class T> 
T* Stack<T>::getPath() 
{ 
 T* path=new T[m_size]; 
 for (int i=0;i<m_size;i++) 
 { 
  path[i]=data[i]; 
 } 
 return path; 
} 
 
template<class T> 
int Stack<T>::getSize() 
{ 
 return m_size; 
} 
Vertex 류 는 모든 결점 을 옮 겨 다 니 기 에 편리 하 다.

class CVertex 
{ 
private: 
 int m_num;//              
 int *m_nei; //            
 int *m_flag; //               
 bool isin; //        
public: 
 CVertex(); 
 void Initialize(int num,int a[]); 
 int getOne(); //              
 void resetFlag(); //                  
 void setIsin(bool);//          
 bool isIn(); //          
 void Reset();// isin   flag 0 
 ~CVertex(); 
 
};

CVertex::CVertex() 
{ 
 m_num=SIZE; 
 m_nei=new int[m_num]; 
 m_flag=new int[m_num]; 
 isin=false; 
 for (int i=0;i<m_num;i++) 
 { 
  m_flag[i]=0; 
 } 
  
} 
void CVertex::Initialize(int num,int a[]) 
{ 
 m_num=num; 
 for (int i=0;i<m_num;i++) 
 { 
  m_nei[i]=a[i]; 
 } 
} 
CVertex::~CVertex() 
{ 
 delete []m_nei; 
 delete []m_flag; 
} 
int CVertex::getOne() 
{ 
 int i=0; 
 for (i=0;i<m_num;i++) 
 { 
  if (m_flag[i]==0) //        
  { 
   m_flag[i]=1; //           ,      
   return m_nei[i]; 
  } 
 } 
 return -1; //            -1 
} 
void CVertex::resetFlag() 
{ 
 for (int i=0;i<m_num;i++) 
 { 
  m_flag[i]=0; 
 } 
} 
void CVertex::setIsin(bool a) 
{ 
 isin=a; 
} 
bool CVertex::isIn() 
{ 
 return isin; 
} 
void CVertex::Reset() 
{ 
 for (int i=0;i<m_num;i++) 
 { 
  m_flag[i]=0; 
 } 
 isin=false; 
} 
정점 클래스 초기 화

int a[SIZE],num; 
for ( i=0;i<SIZE;i++) 
{ 
 num=0; 
 for (int j=0;j<SIZE;j++) 
 { 
   
  if (m_graph.Edge[i][j]!=MaxWeight&&i!=j) 
  { 
   a[num]=j; 
   num++; 
  } 
   
 } 
 vertex[i].Initialize(num,a); 
알고리즘 구현(MFC 기반 이 므 로 모든 아래 코드 를 직접 사용 할 수 없습니다)

stack.push(selection1); //      
vertex[selection1].setIsin(true); //       
int path_num=0; 
while (!stack.isEmpty()) //       
{ 
  
 int flag=vertex[stack.peek()].getOne(); //        
 if (flag==-1) //            
 { 
  int pop=stack.pop(); //        
  vertex[pop].resetFlag(); //               
  vertex[pop].setIsin(false); //          
  continue; //         
 } 
 if (vertex[flag].isIn()) //      ,       
 { 
  continue; 
 } 
 if (stack.getSize()>maxver-1) //                 ,                  
 { 
  int pop=stack.pop(); 
  vertex[pop].resetFlag(); 
  vertex[pop].setIsin(false); 
  continue; 
 } 
 stack.push(flag); //       
  
 vertex[flag].setIsin(true); //      
  
 if (stack.peek()==selection2) //         ,       
 { 
  int *path=stack.getPath(); 
   //          
  int pop=stack.pop(); //    ,     
   vertex[pop].setIsin(false); //         
 } 
  
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기