bon

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(2)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

这个算法实现比dijkstra+heap简单,但是时间效率低一些 (O(VE))。可以判断是否有负权的环。
算法的基础是单源最短路问题中的path-relaxation property:设v_0到v_k的最短路为p={v_0, .... ,v_k},若p被relax的顺序是(v_0, v_1),...,(v_k-1,v_k),则最后得到的v_0到p上各点的距离就是最短距离。
#include <iostream>
#define MAXN 200
#define INF 0xfffffff

using namespace std;

int list[MAXN][MAXN][2];    // 存储图,list[i][j][0]表节点编号,list[i][j][1]表节点i到list[i][j][0]的距离
int deg[MAXN];                // 各节点的出度
int n;                        // 节点数
int trace[MAXN];            // 存储最短路
int d[MAXN];                // 算法结束时d[i]存源到节点i的最短距离

void initialize_single_source()
{
    
int i;
    
for(i=1;i<=n;i++) d[i]=INF;
    d[
1]=0;
}


void relax(int u,int v)
{
    
if(d[list[u][v][0]]>d[u]+list[u][v][1])
    
{
        trace[list[u][v][
0]]=u;
        d[list[u][v][
0]]=d[u]+list[u][v][1];
    }

}


int bellman_ford()
{// 若存在负环返回-1;否则返回1
    int i,j,k;
    initialize_single_source();
    
for(i=0;i<n-1;i++)
    
{// 对所有边relax n-1次
        for(j=1;j<=n;j++)
        
{// 遍历所有边
            for(k=0;k<deg[j];k++) relax(j,k);
        }

    }

    
// 检查是否有负权的环
    for(i=1;i<=n;i++)
    
{
        
for(j=0;j<deg[i];j++)
        
{
            
if(d[list[i][j][0]]>d[i]+list[i][j][1]) return -1;
        }

    }

    
//for(i=1;i<=n;i++) printf("%d distance:%d\n",trace[i],d[i]);
    return 1;
}


void readdata()
{
    
int i,j;
    scanf(
"%d",&n);
    
for(i=1;i<=n;i++)
    
{
        scanf(
"%d",&deg[i]);
        
for(j=0;j<deg[i];j++)
        
{
            scanf(
"%d%d",&list[i][j][0],&list[i][j][1]);
        }

    }

}


int main()
{
    freopen(
"test.txt","r",stdin);
    readdata();
    printf(
"%d",bellman_ford());
    
return 1;
}

posted on 2008-01-31 22:46 bon 阅读(174) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


Google PageRank 
Checker - Page Rank Calculator