【转】经典的图论算法C++描述

news/2024/7/10 4:41:27 标签: 算法, c++, path, struct, list, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

http://www.yuanma.org/data/2006/0824/article_1398.htm

 

本标程介绍了一些经典的图论class="tags" href="/tags/SuanFa.html" title=算法>算法,C++描述。

#include < cstring >
// 常量定义:
const   int  maxV = 100 ;
const   double  Inf = 1e100;
// const int Inf=2000000000;
// Graph类定义:
template < class  T >
class="tags" href="/tags/STRUCT.html" title=struct>struct  GraphMatrix {
    
int  v;     // 顶点数
     int  e;     // 边数
    T a[maxV][maxV];     // 邻接矩阵
     void  init() {
        memset(a,
0 , sizeof (a));
    }

    
void  clear() {
        
int  i,j;
        
for (i = 0 ; i < v;  ++ i) {
            
for (j = 0 ; j < v;  ++ j)
                a[i][j]
= Inf;
        }

    }

}
;

#include
< class="tags" href="/tags/LIST.html" title=list>list >
using  std::class="tags" href="/tags/LIST.html" title=list>list;
template
< class  T >
class="tags" href="/tags/STRUCT.html" title=struct>struct  GraphList {
    
int  v;
    
int  e;
    class="tags" href="/tags/LIST.html" title=list>list
< T >  a[maxV];     // 邻接表
     void  clear() { // clear()应在更改v之前进行
         int  i;
        
for (i = 0 ; i < v; i ++ )
            a[i].clear();
    }

    
~ GraphList() {
        v
= maxV;
        clear();
    }

}
;

namespace  bridgeNS {
/* 解决:查找、打印桥
 *class="tags" href="/tags/SuanFa.html" title=算法>算法:DFS——O(E)
 *输入:连通图(表):g
 *输出:屏幕
 
*/

    GraphList
< int >  g;
    
int  cnt;
    
int  pre[maxV];     // DFS顺序
     int  low[maxV];     // 最低前序编号:儿子low值的最小值
     void  _bridge( int  prnt,  int  w) {
        
int  v; // son
        low[w] = pre[w] = cnt ++ ;
        std::class="tags" href="/tags/LIST.html" title=list>list
< int > ::iterator li;
        
for (li = g.a[w].begin(); li != g.a[w].end();  ++ li) {
            v
=* li;
            
if (pre[v] ==- 1 ) {
                _bridge(w,v);
                
if (low[w]  >  low[v]) low[w]  =  low[v];
                
if (low[v]  ==  pre[v])
                    printf(
" %d-%d/n " ,w,v); // 找到桥
            }
else   if (v != prnt  &&  low[w]  >  pre[v]) low[w]  =  pre[v];
        }

    }

    
void  bridge() {
        cnt
= 0 ;
        memset(pre,
- 1 , sizeof (pre));
        _bridge(
- 1 , 0 );
    }

}
        

namespace  GabowNS {
/* 解决:强分量
 *class="tags" href="/tags/SuanFa.html" title=算法>算法:Gabow——O(E)
 *输入:图(表):g
 *输出:分量编号sc[]
 
*/

    GraphList
< int >  g;
    
int  cnt0, cnt1;
    
int  sc[maxV]; // 分量编号
     int  pre[maxV];     // DFS顺序
     int  class="tags" href="/tags/PATH.html" title=path>path[maxV],pp; // class="tags" href="/tags/PATH.html" title=path>path栈
     int  stack[maxV],sp; //

    
void  _SCdfsR( int  w) {
        pre[w]
= cnt0 ++ ;
        stack[sp
++ ] = w;
        class="tags" href="/tags/PATH.html" title=path>path[pp
++ ] = w;
        
int  v; std::class="tags" href="/tags/LIST.html" title=list>list < int > ::iterator li;
        
for (li = g.a[w].begin(); li != g.a[w].end();  ++ li) {
            v
=* li;
            
if (pre[v] ==- 1 ) _SCdfsR(v);
            
else   if (sc[v] ==- 1 ) {
                
while (pre[class="tags" href="/tags/PATH.html" title=path>path[pp - 1 ]]  >  pre[v])  -- pp;
            }

        }

        
if (class="tags" href="/tags/PATH.html" title=path>path[pp - 1 !=  w)  return ;
        
-- pp;
        
do {
            sc[stack[
-- sp]] = cnt1;
        }
while (stack[sp]  !=  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 (sc[i] ==- 1 )
                _SCdfsR(i);
        }

    }


    
bool  isStrongReach( int  s,  int  t) {
        
return  sc[s] == sc[t];
    }

}


namespace  PrimNS {
/* 解决:最小生成树MST
 *class="tags" href="/tags/SuanFa.html" title=算法>算法:Prim——O(V^2)
 *输入:加权连通图(矩阵):g
 *输出:父节点st[],与其父之边的权重wt[]
 
*/

    GraphMatrix
< double >  g;
    
int  st[maxV];     // MST节点之父——用以保存MST
     double  wt[maxV + 1 ];     // 与其父的边的权重
     int  fr[maxV];     // 非树顶点的最近树顶点
     void  mst() {
        
int  v, w, min;
        
for (v = 0 ; v < g.v;  ++ v) {
            st[v]
=- 1 ; fr[v] = v; wt[v] = Inf;
        }

        st[
0 ] = 0 ; wt[g.v] = Inf;
        
for (min = 0 ; min != g.v;) {
            v
= min; st[v] = fr[v];
            
for (w = 0 , min = g.v; w < g.v;  ++ w) {
                
if (st[w] ==- 1 ) {
                    
if (g.a[v][w]  <  wt[w])
                        wt[w]
= g.a[v][w], fr[w] = v;
                    
if (wt[w]  <  wt[min])
                        min
= w;
                }

            }

        }

    }

}

    
namespace  DijkstraNS {  
/* 解决:非负权图单源最短路径树SPT
 *class="tags" href="/tags/SuanFa.html" title=算法>算法:Dijkstra——O(V^2)
 *输入:加权连通图(矩阵):g
 *输出:父节点st[],与其父之边的权重wt[]
 
*/

    GraphMatrix
< double >  g;
    
int  st[maxV];    
    
double  wt[maxV + 1 ];    
    
int  fr[maxV];     // 非树顶点的最近树顶点
     void  spt( int  s) {
        
int  v, w, min;
        
for (v = 0 ; v < g.v;  ++ v) {
            st[v]
=- 1 ; fr[v] = v; wt[v] = Inf;
        }

        st[s]
= s; wt[g.v] = Inf; wt[s] = 0 ;
        
for (min = s; min != g.v;) {
            v
= min; st[v] = fr[v];
            
for (w = 0 , min = g.v; w < g.v;  ++ w) {
                
if (st[w] ==- 1 ) {
                    
if (g.a[v][w] != Inf  &&  wt[v] + g.a[v][w]  <  wt[w])
                        wt[w]
= wt[v] + g.a[v][w], fr[w] = v;
                    
if (wt[w]  <  wt[min])
                        min
= w;
                }

            }

        }

    }

}

/**/
namespace  FloydNS { //   
/* 解决:所有点对最短路径
 *class="tags" href="/tags/SuanFa.html" title=算法>算法:Floyd——O(V^3)
 *输入:加权连通图(矩阵):g
 *输出:最短距离长度矩阵d[][], 路径矩阵p[][]
 
*/

    GraphMatrix
< double >  g;
    
double  d[maxV][maxV];     // 最短路径长度
     int  p[maxV][maxV];         // 最短路径下一顶点
     void  floyd() {
        
int  i,s,t;
        
for (s = 0 ; s < g.v;  ++ s) {
            
for (t = 0 ; t < g.v;  ++ t)
                
if ( (d[s][t]  =  g.a[s][t])  <  Inf)
                    p[s][t]
= t;
            d[s][s]
= 0 ;
        }

        
for (i = 0 ; i < g.v;  ++ i)
            
for (s = 0 ; s < g.v;  ++ s)
                
if (s != &&  d[s][i]  <  Inf)
                    
for (t = 0 ; t < g.v;  ++ t)
                        
if (d[s][t]  >  d[s][i]  +  d[i][t]) {
                            d[s][t] 
=  d[s][i]  +  d[i][t];
                            p[s][t] 
=  p[s][i];
                        }

    }

}

namespace  TenshiNS { //
/* 解决:二分图最大匹配
 *class="tags" href="/tags/SuanFa.html" title=算法>算法:匈牙利匹配(by Tenshi)——O(xv * yv)
 *输入:邻接矩阵g
 *输出:匹配数cnt,x匹配项xm[],y匹配项ym[]
 *备注:from Bug 06-07-07
 
*/

    
int  xv,yv;     // 顶点数
     int  g[maxV][maxV];     // g[i][j]=1 表示 xi与yj相邻
     int  sy[maxV];     // 辅助:当轮被搜过的y点都是1 
     int  cnt,xm[maxV],ym[maxV];  // 输出 
     void  init() {
        cnt
= 0 ;
        memset(g,
0 , sizeof (g));
        memset(xm,
- 1 , sizeof (xm));
        memset(ym,
- 1 , sizeof (ym));
    }

    
bool  _class="tags" href="/tags/PATH.html" title=path>path( int  u) // 返回是否找到增广路
     {
        
for ( int  v = 0 ;v < yv;v ++ if (g[u][v]  &&   ! sy[v]) { sy[v] = 1 ;
            
if (ym[v] ==- 1   ||  _class="tags" href="/tags/PATH.html" title=path>path(ym[v]))  { xm[u] = v; ym[v] = u;  return   1 ;}
        }
  return   0 ;    
    }

    
void  tenshi()
    
{
        
int  i;
        
for (i = 0 ;i < xv;i ++ )
            
if (xm[i] ==- 1 ) {
                memset(sy,
0 , sizeof (sy));
                cnt
+= _class="tags" href="/tags/PATH.html" title=path>path(i);
            }

    }
 
}

http://www.niftyadmin.cn/n/1606645.html

相关文章

智慧新零售怎么做?来听听百度云的实践分享

自从去年开始&#xff0c;新零售成为行业热点。有公司认为&#xff0c;新零售是线上线下资源的整合&#xff1b;也有公司认为&#xff0c;新零售是利用最新的技术&#xff0c;尤其是互联网技术提升和改造零售。这些观点都没有错&#xff0c;都是各个公司从自己的立场上看待零售…

物联网新时代:百度云天工从理解到唤醒万物

物联网1.0&#xff1a;连接万物物联网无数次被人们提到是下一个风口&#xff0c;你不禁冷笑&#xff0c;这个风口至今还没有猪飞起来&#xff01;瓶颈是连接吗&#xff1f;当然不是&#xff01;自1999年MIT的Kevin Asn-ton教授首次提出物联网概念以来&#xff0c;虽然已经建立初…

“看机识天气”,Netatmo推出iOS专用气象监测仪

对于一些气象爱好者&#xff0c;仅仅温度计和湿度计已经不能满足他们的需求了&#xff0c;他们往往希望了解更多气象的参数。而Netatmo公司推出的一套为iOS设备量身定做的天气监测仪则可以满足这些用户的苛刻要求&#xff0c;除了可以监测基本的温度、湿度&#xff0c;还可以监…

想要快速变现流量?那就快来使用百度云AD Tech

如果您有每天手握几亿PV的入口&#xff0c;想要快速通过程序化交易变现流量&#xff0c;或者您有着明确的广告需求&#xff0c;想通过一套业界领先的DSP系统实现高效投放&#xff0c;那么选择百度云AD Tech无疑会是一个比较明智的选择。百度云AD Tech旨在帮助客户在百度云上迅速…

【转】《言语幽默的图论模型》

http://product.dangdang.com/product.aspx?product_id20449266 内容简介本书立足于语言学传统的幽默研究&#xff0c;在前人成果的基础上提出了“笑话的简式图论模型”&#xff0c;开创了研究幽默文本特别是笑话的一条新途径。全书内容翔实&#xff0c;深入浅出&#xff0c;并…

速来!天匠计划为你打Call

百度作为国内云计算、大数据以及人工智能领域的领导者&#xff0c;一直致力于推动国内智能物联网技术、产品、服务、解决方案以及生态的建设。早在2016年&#xff0c;百度正式对外发布了“人工智能 AI大数据 Big Data云计算 Cloud Computing”ABC三位一体的战略&#xff0c;天工…

Groupon需要面对的三个问题

团购鼻祖Groupon在2012年里被投资人列入了黑名单里面&#xff0c;它能突破现状吗&#xff1f;虽然关于它的负面消息一直被媒体穷追猛打&#xff0c;但是投资人也察觉到这个公司正在重新定位。Groupon的未来状况虽然不是很明朗&#xff0c;但是如果能够回应几个关键问题的话&…

开放共赢,百度创新中心将提供更多价值服务

12月6日&#xff0c;百度&#xff08;滨海&#xff09;创新中心正式启动&#xff1b;12月8日&#xff0c;百度&#xff08;武汉&#xff09;创新中心正式对外运营。新开业的这两个百度创新中心都将结合本地的产业优势&#xff0c;与本地企业共同搭建ABC&#xff08;人工智能AI、…