匿名用户
1级
2010-06-01 回答
//这个是邻接表
typedef struct oo
{
int len,num;
struct oo *next;
} link;
typedef struct
{
int num;
link *next;
} graph;
/*
node[]图的邻接表
n节点总数
s源点
dis[]到源点的最短路径长度
pre[]最短路径上的前驱结点
算法返回true,当且仅当途中不包含从源点可达的负权回路
*/
bool bellmanFord(graph node[],int n,int s)
{
int dis[MAX],pre[MAX];
int i,j;
link *p;
for(i=0;i
{
dis[i]=MAXVALUE;
pre[i]=-1;
}
dis[s]=0;
for(i=0;i
{
p=node[i].next;
while(p)
{
if(p->len+dis[i]num])
{dis[p->num]=p->len+dis[i];pre[p->num]=i;}
p=p->next;
}
p=node[i].next;
while(p)
{
if(p->len+dis[i]num])
return false;
p=p->next;
}
}
for(i=0;i
{
printf("%d %d\n",i,dis[i]);
j=i;
while(j!=-1)
{
printf("%d ",j);
j=pre[j];
}
cout<
}
return true;
}
//这个是邻接矩阵
const int MAX = 100;
const int MAXVALUE = 1000;
int graph[MAX][MAX],n;
/*
graph[][]图的邻接阵
n 图的节点数
s 源点
dis[] 存放最短路径
pre[] 存放最短路径上的前驱节点
算法返回true,当且仅当途中不包含从源点可达的负权回路,并输出每个节点最短路径的前驱值
*/
bool bellmanFord(int graph[][MAX],int n,int s)
{
int dis[MAX],pre[MAX];
int i,j,k;
for(i=0;i
{
dis[i]=MAXVALUE;
pre[i]=-1;
}
dis[s]=0;
for(i=0;i
{
for(j=0;j
if(i!=j&&dis[j]>dis[i]+graph[i][j])
{
dis[j]=dis[i]+graph[i][j];
pre[j]=i;
}
for(j=0;j
if(i!=j&&dis[j]>dis[i]+graph[i][j])
return false;
}
for(i=0;i
{
printf("%d %d\n",i,dis[i]);
k=i;
while(pre[k]!=-1)
{
printf("%d ",pre[k]);
k=pre[k];
}
cout<
}
return true;
}