用鄰接表表示的圖的轉置算法,比較簡單。
#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);
}
}
}