図の構造の深さは優先的に遍歴され、広さは優先的に遍歴されている.

1574 ワード

前言
本論文で議論したのは簡単な図構造で、頂点からその辺までは存在せず、同じ側波比が重複して現れる.
データ構造の定義
//    
class ArcNode
{
	public int adjvex;     //    
	public ArcNode next;
}

//     
class VertexNode
{
	public T vertex;
	public ArcNode firstedge;
}
深さ優先巡回
考え方
  • アクセス頂点root
  • は、頂点rootにアクセスされていない隣接点から頂点vを選択し、vから再び深さ優先
  • を巡回する.
  • は、図中のすべてのrootパスに共通する頂点が
  • にアクセスされるまで、上記の2つのステップを繰り返す.
    コア方法:再帰
    コード
    public void DFSTraverse(int v)
    {
    	ArcNode p = null;
    	int j;
    	Console.WriteLine(adjlist[v].vertex); //    
    	visited[v] = 1;  //           
    	p = adjlist[v].firstedge; //    p    v   
    
    	//      v    j
    	while (p != null)
    	{
    		j = p.adjvex;
    		if (visited[j] == 0)      //            
    			DFSTraverse(j);
    		p = p.next;
    	}
    }
    
    広さ優先巡回、
    考え方
  • はある頂点rootから出発して、root
  • にアクセスします.
  • は、rootの各未訪問の隣接点a,b,c,d,e,f,g…
  • を順次訪問する.
  • は、a,b,c,d,e,f,g.からそれぞれ、それらがアクセスされていない隣接点に順次アクセスし、先にアクセスされた頂点の隣接点を、後に頂点にアクセスされる隣接点より先にする.図中のすべての頂点が
  • を巡回するまで.
    コア方法:サイクル
    コード
    public void BFSTraverse(int v)
    {
    	//      ,          
    	int[] Q = new int[Program.MaxSize];
    	int front = -1, rear = 1;           //     
    
    	ArcNode p = null;
    	Console.WriteLine(adjlist[v].vertex);
    
    	//         
    	visited[v] = 1;
    	Q[++rear] = v;
    
    	//      
    	while (front != rear)
    	{
    		v = Q[++front];
    		p = adjlist[v].firstedge;       //    p    v   
    		while (p != null)
    		{
    			int j = p.adjvex;          //j   v    
    			if (visited[j] == 0)
    			{
    				Console.WriteLine(adjlist[j].vertex);
    				visited[j] = 1;
    				Q[++rear] = j;
    			}
    			p = p.next;
    		}
    	}
    }