您的位置:首页 > 其它

【算法导论】22.1 图的转置

2012-11-18 22:02 162 查看
用邻接表表示的图的转置算法,比较简单。

#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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: