【算法导论】22.1 图的转置

来源:互联网 发布:游戏源码怎么看 编辑:程序博客网 时间:2024/04/28 13:18

用邻接表表示的图的转置算法,比较简单。

#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);}}}

原创粉丝点击