dijkstra与spfa(bellman-Ford)

来源:互联网 发布:vmware mac os 10.12 编辑:程序博客网 时间:2024/06/05 18:53

一丶Dijkstra

对于每一个点都进行松弛,一共松弛n-1次。每次都拿当前点,对于未加入图中的点进行松弛,核心代码:

 for(int i=1;i<=n;i++)    {        minn=INF;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<minn )            {                index=j;                minn=dis[j];            }        }        vis[index]=1;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]>mp[index][j]+dis[index])            {                dis[j]=mp[index][j]+dis[index];            }        }    }
二丶bellman-Ford

进行n-1次松弛,每次松弛一条边:

for(k=1;k<=n-1;k++)//进行n-1次松弛for(i=1;i<=m;i++)//枚举一点    if(dis[v]>dis[u]+w[i])//尝试松弛    dis[v]=dis[u]+w[i];

队列优化:Spfa

int spfa(){    queue <int > q;    for(int i=1;i<=n;i++)        dist[i]=inf,vis[i]=0,cnt[i]=0;    int cur=1;    q.push(cur);    vis[cur]=1;    cnt[cur]=1;    dist[cur]=0;    while(!q.empty())    {        cur=q.front();        q.pop();        vis[cur]=0;        for(int i=head[cur];i!=-1;i=edge[i].next)        {            int id=edge[i].to;            if(dist[id]>dist[cur]+edge[i].val )            {                dist[id]=dist[cur]+edge[i].val;                if(!vis[id])                {                    cnt[id]++;                    vis[id]=1;                    q.push(id);                    if(cnt[cur]>n)                        return 1;                }            }        }    }    return 0;}



0 0
原创粉丝点击