图论最短路Dijkstra+heap和SPFA

SPFA算法最短路(即Bellman-Ford队列优化)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;

int head[101],cnt;
int dis[101];
bool inq[101];

struct EDGE
{
    int next;
    int to;
    int w;
}edge[101];

void add(int u,int v,int w)
{
    edge[++cnt].next=head[u];
    edge[cnt].to=v;
    edge[cnt].w=w;
    head[u]=cnt;
}

void SPFA(int startpoint)
{
    memset(dis,INF,sizeof(dis));
    memset(inq,false,sizeof(inq));
    int s=startpoint;
    dis[s]=0;
    queue<int> q;
    q.push(s);
    inq[s]=true;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        inq[u]=false;
        for(int i=head[u];i!=0;i=edge[i].next)
        {
            int v=edge[i].to;
            if(dis[v]>dis[u]+edge[i].w)
            {
                dis[v]=dis[u]+edge[i].w;
                if(!inq[v])
                {
                    q.push(v);
                    inq[v]=true;
                }
            }
        }
    }
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    SPFA(1);
    cout<<dis[3];//测试用输出

    return 0;
}

dijkstra堆优化:

#include <iostream>
#include <cstdio>
#include <queue>
#define maxn 200005
#define INF 0x3f3f3f3f
using namespace std;

int head[maxn],cnt;
int n,m,s;
bool visited[maxn];

struct EDGE
{
    int to;
    int next;
    int w;
}edge[maxn];

struct node
{
    int dis,index;
    bool operator < (const node &k)const
    {
        return dis>k.dis;//因为要保证dis小的优先,所以dis从大到小排序
    }
}d[maxn];

void add(int u,int v,int w)
{
    edge[++cnt].next=head[u];
    edge[cnt].to=v;
    edge[cnt].w=w;
    head[u]=cnt;
}

void dijkstra()
{
    for(int i=1;i<=n;i++)
    {
        visited[i]=false;
        d[i].dis=INF;
        d[i].index=i;
    }
    priority_queue<node> q;
    d[s].dis=0;q.push(d[s]);

    while(!q.empty())
    {
        int u=q.top().index;
        q.pop();
        if(visited[u])continue;
        visited[u]=1;

        for(int i=head[u];i!=0;i=edge[i].next)
        {
            int v=edge[i].to;
            if(d[v].dis>d[u].dis+edge[i].w)
            {
                d[v].dis=d[u].dis+edge[i].w;
                q.push(d[v]);
            }
        }
    }
}

int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    dijkstra();

    for(int i=1;i<=n;i++)
    {
        printf("%d ",d[i].dis);
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Bw-Orzzzzz/p/10829024.html
今日推荐