【算法導論】22.1 圖的轉置

用鄰接表表示的圖的轉置算法,比較簡單。

#include <iostream>
using namespace std;

#define  N 8
#define INFINITE 0x7fffffff
#define WHITE 1
#define GRAY 2
#define BLACK 3

//頂點結點結構  
struct Vertex  
{  
	Vertex * next;/*指向下一個頂點*/
	int id;/*節點的標誌*/
    Vertex():next(NULL),id(0){}  
};  

//圖結構
struct Graph
{
	Vertex *Adj[N+1];//N個頂點及鄰接點頭指針
	int color[N+1];//顏色 
	int p[N+1];//指向遍歷樹節點的父結點 
	int d[N+1];/*節點發現時間*/
	int f[N+1];/*節點結束遍歷時間*/
	Graph()
	{ 
        for(int i = 1; i <= N; i++)  
		{
            Adj[i] = new Vertex;
			color[i]=WHITE;
			d[i] = 0;
			f[i] = 0;
			p[i] = 0;
		}
	}
	~Graph()  
    {  
        for(int i = 1; i <= N; i++)  
            delete Adj[i];  
    }  
};

void Print(Graph *g);
bool Init(Graph *g);
bool InsertEdge(Graph *g , int start,int end);
void PaintColor(Graph *g,int vertex,int color);
void DepthFirstVisit(Graph *g,int vertex,int& v_time);

//插入邊
bool InsertEdge(Graph *g , int start,int end)
{
	Vertex* v = new Vertex();
	v->id = end;
	if(g->Adj[start]->next == NULL)
	{/*如果不存在臨界表的頭結點列表中,則插入*/
		Vertex* s = new Vertex();
		s->id = start;
		g->Adj[start] = s;
	}
	Vertex* tmp = g->Adj[start];
	while(tmp->next)
	{
		tmp = tmp->next;
	}
	tmp->next =v;
	return true;
}

/*圖的轉置方法*/
bool TransposedMap(Graph *g,Graph *gt)
{
	if((g == NULL) || (gt == NULL))
	{
		return false;
	}
	for(int i=0;i<N;i++)
	{
		Vertex * v = g->Adj[i];
		while(v)
		{
			InsertEdge(gt,v->id,i);
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章