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

floyd 多源多汇最短路

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxx=0x3f3f3f3f;
 4 int mp[150][150];
 5 int nodenum,edgenom;
 6 int floyd(int scr,int des)///多源多汇最短路
 7 {
 8     for(int k=1;k<=nodenum;k++)
 9     {
10         for(int i=1;i<=nodenum;i++)
11         {
12             for(int j=1;j<=nodenum;j++)
13             {
14                 mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
15             }
16         }
17     }
18     return mp[scr][des];
19 }
20 int main()
21 {
22     int start,endd,cost;
23     while(scanf("%d %d",&nodenum,&edgenom)&&(nodenum+edgenom))
24     {
25         for(int i=1;i<=nodenum;++i)
26         {
27             for(int j=1;j<=nodenum;++j)
28             {
29                 mp[i][j]=maxx;
30             }
31         }
32         for(int i=1;i<=edgenom;++i)
33         {
34             scanf("%d %d %d",&start,&endd,&cost);
35             mp[start][endd]=min(mp[start][endd],cost);
36             mp[endd][start]=min(mp[endd][start],cost);
37         }
38         cout<<floyd(1,nodenum)<<'\n';
39     }
40     return 0;
41 }

 

迪杰斯特拉普通版本:

#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])///dis[t[i].v]>dis[t[i].u]+t[i].l { 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; }

 spfa 链式前向星

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 const int maxn=30000;
 5 int head[maxn];
 6 int cnt[150];
 7 bool vis[150];
 8 int dis[150];
 9 int nodenum,edgenom,tot;
10 struct edge
11 {
12     int u,v,l,next;
13 }t[maxn];
14 void addedge(int x,int y,int z)
15 {
16     t[tot].u=x;
17     t[tot].v=y;
18     t[tot].l=z;
19     t[tot].next=head[x];
20     head[x]=tot++;
21 }
22 int spfa(int src,int des)///scorce,destination
23 {
24     memset(dis,INF,sizeof(dis));
25     memset(vis,0,sizeof(vis));
26     memset(cnt,0,sizeof(cnt));
27     queue<int>q;
28     dis[src]=0;
29     vis[src]=1;
30     q.push(src);
31     while(!q.empty())
32     {
33         int now=q.front();
34         q.pop();
35         if(++cnt[now]>nodenum)
36         {
37             return 0;
38         }
39         vis[now]=0;
40         for(int i=head[now];~i;i=t[i].next)
41         {
42             if(dis[t[i].v]>t[i].l+dis[now])///能更新就更新
43             {
44                 dis[t[i].v]=t[i].l+dis[now];
45                 if(!vis[t[i].v])
46                 {
47                     vis[t[i].v]=1;
48                     q.push(t[i].v);
49                 }
50             }
51         }
52     }
53     return 1;
54 }
55 int main()
56 {
57     int start,endd,cost;
58     while(scanf("%d %d",&nodenum,&edgenom)&&(nodenum+edgenom))
59     {
60         tot=0;
61         memset(head,-1,sizeof(head));
62         for(int i=1;i<=edgenom;++i)
63         {
64             scanf("%d %d %d",&start,&endd,&cost);
65             addedge(start,endd,cost);
66             addedge(endd,start,cost);
67         }
68         if(!spfa(1,nodenum))
69         {
70             cout<<"-1"<<'\n';
71         }
72         else
73         {
74             cout<<dis[nodenum]<<'\n';
75         }
76     }
77     return 0;
78 }

 

posted @ 2019-07-24 21:09  观稳769  阅读(489)  评论(0编辑  收藏  举报