心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0

SPFA的基本思路是:只有被修改过最短路的顶点,才有可能导致修改与它邻接的顶点的最短路。于是很容易想到用一个队列维护。
以下是我的代码:

#include<stdio.h>
#define min(a,b) (a<b?a:b)
const long maxn=507;
const long INF=100000007;
typedef 
struct
{
    
long front,rear,count,item[maxn];
}queue;
void clear(queue &q)
{
    q.count
=0;
    q.front
=0;
    q.rear
=-1;
}
bool empty(queue &q)
{
    
return (q.count==0);
}
void push(queue &q,long x)
{
    q.rear
++;
    q.item[q.rear]
=x;
    q.count
++;
}
long pop(queue &q)
{
    
long x=q.item[q.front];
    q.front
++;
    q.count
--;
    
return x;
}
//  Queue
typedef struct EDGE_NODE
{
    
long u,v,w;
    
struct EDGE_NODE *next;
}edge_node;
long n,m,d[maxn];
edge_node 
*a[maxn];
//  Var
void insert(long begin,long end,long weight)
{
    edge_node 
*p=new edge_node;
    p
->u=begin;p->v=end;p->w=weight;
    p
->next=a[begin]->next;
    a[begin]
->next=p;
}
bool bellman_ford(long s)
{
    
bool in[maxn];
    
long in_num[maxn];
    queue q;clear(q);
    edge_node 
*p;
    
for(long i=1;i<=n;i++)
    {
       d[i]
=(i==s?0:INF);
       
in[i]=false;
       in_num[i]
=0;
    }
    push(q,s);
    
in[s]=true;
    in_num[s]
++;
    
while(!empty(q))
    {
       
long i=pop(q);in[i]=false;
       
for(p=a[i]->next;p;p=p->next)
       {
          
long j=p->v;
          
if(d[i]+p->w<d[j])
          {
             d[j]
=d[i]+p->w;
             
if(!in[j])
             {
                push(q,j);
                
in[j]=true;
                in_num[j]
++;
                
if(in_num[j]>n) return false;
             }
          }
       }
    }
    
return true;
}
int main()
{
    
//*
    freopen("data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
//*/
    scanf("%ld%ld",&n,&m);
    
for(long i=1;i<=n;i++)
    {
       a[i]
=new edge_node;
       a[i]
->next=NULL;
    }
    
for(long i=1;i<=m;i++)
    {
       
long a,b,w;
       scanf(
"%ld%ld%ld",&a,&b,&w);
       insert(a,b,w);
       insert(b,a,w);
    }
    
if(bellman_ford(1))
    {
       
for(long i=1;i<=n;i++) printf("%ld ",d[i]);
       putchar(
'\n');
    }
    
else printf("Error\n");
return 0;
}
posted on 2010-01-06 18:17 lee1r 阅读(159) 评论(0)  编辑 收藏 引用 所属分类: 算法与数据结构

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