【算法导论】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);
}
}
}
#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);
}
}
}
相关文章推荐
- 算法导论 CLRS 22.1-6 解答
- 算法导论22.1-7
- 算法导论4:快速排序 2016.1.4
- Introduction to Algorithms (算法导论) 学习笔记 -- Chapter 9
- 【算法导论】二叉排序树
- 【算法导论】红黑树
- 算法导论 红黑树加入节点
- 算法导论代码 第14章 数据结构的扩张
- 2011-03-06 算法导论 第8章 线性时间排序
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 算法导论 第15章 动态规划:15.1钢条切割
- 算法导论学习笔记--第一章、第二章
- 算法导论6.1-7习题解答
- 堆排序__算法导论实现
- 编程珠玑读书笔记——串的转置算法
- 算法导论-第24章- 单源最短路径 - 24.3 Dijkstra 算法
- 堆排序详细分析(算法导论第六章)
- 【算法导论33】跳跃表(Skip list)原理与java实现
- 欧拉回路问题(算法导论22.2-8 和22-3)
- 【算法导论】幻方算法