【最短路】dijkstra模板 链式前向星 + 优先队列

普通版本:

#include <bits/stdc++.h>
using namespace std;
const int maxx=0x3f3f3f3f;
int mp[150][150];
int dis[150];
bool vis[150];
int nodenum,edgenom;
int dijkstra(int scr,int des)
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=nodenum;++i)
    {
        dis[i]=mp[scr][i];
    }
    dis[scr]=0;
    vis[scr]=1;
    for(int i=1;i<=nodenum;i++)
    {
        int tmp=maxx;
        int k;
        for(int j=1;j<=nodenum;j++)
        {
            if(!vis[j]&&tmp>dis[j])
            {
                tmp=dis[j];
                k=j;
            }
        }
        if(tmp==maxx)
        {
            break;
        }
        vis[k]=1;
        for(int j=1;j<=nodenum;j++)
        {
            if(!vis[j]&&dis[j]>dis[k]+mp[k][j])
            {
                dis[j]=dis[k]+mp[k][j];
            }
        }
    }
    return dis[des];
}
int main()
{
    int start,endd,cost;
    while(scanf("%d %d",&nodenum,&edgenom)&&(nodenum+edgenom))
    {
        for(int i=1;i<=nodenum;++i)
        {
            for(int j=1;j<=nodenum;++j)
            {
                mp[i][j]=maxx;
            }
        }
        for(int i=1;i<=edgenom;++i)
        {
            scanf("%d %d %d",&start,&endd,&cost);
            mp[start][endd]=min(mp[start][endd],cost);
            mp[endd][start]=min(mp[endd][start],cost);
        }
        cout<<dijkstra(1,nodenum)<<'\n';
    }
    return 0;
}

链式前向星+优先队列

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=30000;
int head[maxn];
bool vis[150];
int dis[150];
int nodenum,edgenom,tot;
struct edge
{
    int u,v,l,next;
}t[maxn];
struct A
{
    int pos,cost;
    bool operator < (const A &a)const{
        return cost>a.cost;
    }
};
void addedge(int x,int y,int z)
{
    t[tot].u=x;
    t[tot].v=y;
    t[tot].l=z;
    t[tot].next=head[x];
    head[x]=tot++;
}
int dijkstra(int src,int des)///scorce,destination
{
    memset(dis,INF,sizeof(dis));
    memset(vis,0,sizeof(vis));
    priority_queue<A>q;
    dis[src]=0;
    A now;
    now.cost=0;
    now.pos=src;
    q.push(now);
    while(!q.empty())
    {
        now=q.top();
        q.pop();
        if(vis[now.pos])
        {
            continue;
        }
        vis[now.pos]=1;
        for(int i=head[now.pos];~i;i=t[i].next)
        {
            int to=t[i].v;
            if(!vis[to]&&dis[to]>t[i].l+dis[t[i].u])///src到k点的距离+k点到可更新点的距离<dis[可更新点]
            {
                dis[to]=dis[t[i].u]+t[i].l;
                now.cost=dis[to];
                now.pos=to;
                q.push(now);
            }
        }
    }
    return dis[des];
}
int main()
{
    int start,endd,cost;
    while(scanf("%d %d",&nodenum,&edgenom)&&(nodenum+edgenom))
    {
        tot=0;
        memset(head,-1,sizeof(head));
        for(int i=1;i<=edgenom;++i)
        {
            scanf("%d %d %d",&start,&endd,&cost);
            addedge(start,endd,cost);
            addedge(endd,start,cost);
        }
//        for(int i=0;i<tot;i++)
//        {
//            cout<<t[i].u<<' '<<t[i].v<<' '<<t[i].l<<'\n';
//        }
        cout<<dijkstra(1,nodenum)<<'\n';
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/guanwen769aaaa/p/11240868.html