一些经典的图论算法(C++描述).doc

上传人:公**** 文档编号:548314104 上传时间:2023-10-07 格式:DOC 页数:37 大小:173.51KB
返回 下载 相关 举报
一些经典的图论算法(C++描述).doc_第1页
第1页 / 共37页
一些经典的图论算法(C++描述).doc_第2页
第2页 / 共37页
一些经典的图论算法(C++描述).doc_第3页
第3页 / 共37页
一些经典的图论算法(C++描述).doc_第4页
第4页 / 共37页
一些经典的图论算法(C++描述).doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《一些经典的图论算法(C++描述).doc》由会员分享,可在线阅读,更多相关《一些经典的图论算法(C++描述).doc(37页珍藏版)》请在金锄头文库上搜索。

1、一些经典的图论算法,C+描述。 #include / 常量定义: const int maxV = 100 ; const double Inf = 1e100; / const int Inf=2000000000; / Graph类定义: template struct GraphMatrix int v; / 顶点数 int e; / 边数 T amaxVmaxV; / 邻接矩阵 void init() memset(a, 0 , sizeof (a); void clear() int i,j; for (i = 0 ; i v; + i) for (j = 0 ; j v; + j)

2、 aij = Inf; ;#include using std:list;template struct GraphList int v; int e; list amaxV; / 邻接表 void clear() / clear()应在更改v之前进行 int i; for (i = 0 ; i v; i + ) ai.clear(); GraphList() v = maxV; clear(); ; namespace bridgeNS /*/ /* 解决:查找、打印桥 *算法:DFSO(E) *输入:连通图(表):g *输出:屏幕 */ GraphList g; int cnt; int

3、premaxV; / DFS顺序 int lowmaxV; / 最低前序编号:儿子low值的最小值 void _bridge( int prnt, int w) int v; / son loww = prew = cnt + ; std:list :iterator li; for (li = g.aw.begin(); li != g.aw.end(); + li) v =* li; if (prev =- 1 ) _bridge(w,v); if (loww lowv) loww = lowv; if (lowv = prev) printf( %d-%dn ,w,v); / 找到桥 e

4、lse if (v != prnt & loww prev) loww = prev; void bridge() cnt = 0 ; memset(pre, - 1 , sizeof (pre); _bridge( - 1 , 0 ); namespace GabowNS /*/ /* 解决:强分量 *算法:GabowO(E) *输入:图(表):g *输出:分量编号sc */ GraphList g; int cnt0, cnt1; int scmaxV; / 分量编号 int premaxV; / DFS顺序 int pathmaxV,pp; / path栈 int stackmaxV,s

5、p; / 栈 void _SCdfsR( int w) prew = cnt0 + ; stacksp + = w; pathpp + = w; int v; std:list :iterator li; for (li = g.aw.begin(); li != g.aw.end(); + li) v =* li; if (prev =- 1 ) _SCdfsR(v); else if (scv =- 1 ) while (prepathpp - 1 prev) - pp; if (pathpp - 1 != w) return ; - pp; do scstack - sp = cnt1;

6、 while (stacksp != w); + cnt1; void init() memset(pre, - 1 , sizeof (pre); memset(sc, - 1 , sizeof (sc); cnt0 = cnt1 = 0 ; sp = pp = 0 ; int i; for (i = 0 ; i g.v; + i) if (sci =- 1 ) _SCdfsR(i); bool isStrongReach( int s, int t) return scs = sct; namespace PrimNS /*/ /* 解决:最小生成树MST *算法:PrimO(V2) *输

7、入:加权连通图(矩阵):g *输出:父节点st,与其父之边的权重wt */ GraphMatrix g; int stmaxV; / MST节点之父用以保存MST double wtmaxV + 1 ; / 与其父的边的权重 int frmaxV; / 非树顶点的最近树顶点 void mst() int v, w, min; for (v = 0 ; v g.v; + v) stv =- 1 ; frv = v; wtv = Inf; st 0 = 0 ; wtg.v = Inf; for (min = 0 ; min != g.v;) v = min; stv = frv; for (w =

8、 0 , min = g.v; w g.v; + w) if (stw =- 1 ) if (g.avw wtw) wtw = g.avw, frw = v; if (wtw wtmin) min = w; namespace DijkstraNS /*/ /* 解决:非负权图单源最短路径树SPT *算法:DijkstraO(V2) *输入:加权连通图(矩阵):g *输出:父节点st,与其父之边的权重wt */ GraphMatrix g; int stmaxV; double wtmaxV + 1 ; int frmaxV; / 非树顶点的最近树顶点 void spt( int s) int

9、 v, w, min; for (v = 0 ; v g.v; + v) stv =- 1 ; frv = v; wtv = Inf; sts = s; wtg.v = Inf; wts = 0 ; for (min = s; min != g.v;) v = min; stv = frv; for (w = 0 , min = g.v; w g.v; + w) if (stw =- 1 ) if (g.avw != Inf & wtv + g.avw wtw) wtw = wtv + g.avw, frw = v; if (wtw wtmin) min = w; /*/ /*/ namespace FloydNS /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号