最短路基础

http://acm.hdu.edu.cn/showproblem.php?pid=2544

Dijkstra邻接链表(适用于边少,顶点多):

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #define INF 0xfffffff
 6 #define N 1100
 7 #include<vector>
 8 using namespace std;
 9 
10 struct node
11 {
12     int e,w;
13 };
14 
15 int n,m,vis[N],dist[N];
16 vector<node>G[N];
17 
18 void Dij(int Start,int End)
19 {
20     int i,j,Min,index;
21     vis[Start]=1;
22     dist[Start]=0;
23 
24     node p;
25     for(i=1; i<=n; i++)
26     {
27         Min=INF;
28         index=Start;
29         for(j=1; j<=n; j++)
30             if(vis[j]==0&&Min>dist[j])
31                 Min=dist[j],index=j;
32         vis[index]=1;
33         int len=G[index].size();
34         for(j=0; j<len; j++)
35         {
36             p=G[index][j];
37             if(vis[p.e]==0&&dist[p.e]>dist[index]+p.w)
38                 dist[p.e]=dist[index]+p.w;
39         }
40     }
41 
42 }
43 
44 int main()
45 {
46     int i,a,b,c;
47     node p;
48     while(scanf("%d%d",&n,&m),m+n)
49     {
50         for(i=0; i<N; i++)
51         {
52             dist[i]=INF;
53             vis[i]=0;
54             G[i].clear();
55         }
56         for(i=0; i<m; i++)
57         {
58             scanf("%d%d%d",&a,&b,&c);
59             p.e=b;
60             p.w=c;
61             G[a].push_back(p);
62             p.e=a;
63             G[b].push_back(p);
64         }
65         Dij(1,n);
66         printf("%d
",dist[n]);
67     }
68     return 0;
69 }
View Code

Dijkstra链接矩阵(适用于变多,顶点少):

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
#define INF 0xfffffff
#define N 1100
int n,m,maps[N][N],dist[N],vis[N];//dist[i]表示从起点到i的最短距离;
void Dij(int Star ,int End)
{
    int i,j,index,Min;
    dist[Star]=0;
    vis[Star]=1;
    index=Star;
    for(i=1;i<=n;i++)
    {
        Min=INF;
        for(j=1;j<=n;j++)
        {
            if(Min>dist[j]&&vis[j]==0)
            {
                Min=dist[j];
                index=j;
            }
        }
        vis[index]=1;
        for(j=1;j<=n;j++)
        {
            if(vis[j]==0&&dist[j]>dist[index]+maps[index][j])
                dist[j]=dist[index]+maps[index][j];
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m),m+n)
    {
        int i,j,a,b,c;
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
            {
                maps[i][j]=INF;
            }
            vis[i]=0;
            dist[i]=INF;
        }//初始化;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            maps[a][b]=min(maps[a][b],c);
            maps[b][a]=maps[a][b];
        }
        Dij(1,n);
        printf("%d
",dist[n]);
    }
    return 0;
}
View Code

Floyd:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 0xfffffff
#define N 1100
using namespace std;
int n,m;
int maps[N][N];
void Floyd()
{
    int i,j,k;
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
                maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]);
        }
}
void Init()
{
    int i,j;
    for(i=0; i<=n; i++)
        for(j=0; j<=n; j++)
            if(i==j)
                maps[i][j]=0;
            else
                maps[i][j]=INF;
}
int main()
{
    int i,a,b,c;
    while(scanf("%d%d",&n,&m),m+n)
    {
        Init();
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            maps[a][b]=maps[b][a]=c;
        }
        Floyd();
        printf("%d
",maps[1][n]);
    }
    return 0;
}
View Code

 spfa(适用于点多或者有负环的情况):

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define INF 0xfffffff
#define N 1010
using namespace std;
int Head[N], cnt, dist[N], n, vis[N];
struct Edge
{
    int v, w, next;
} e[N*2];
void Add(int u, int v, int w)
{
    e[cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=Head[u];
    Head[u]=cnt++;
}
int spfa(int s)
{
    queue<int>Q;
    int u, v;
    memset(vis, 0, sizeof(vis));
    dist[s]=0;
    vis[s]=1;
    Q.push(s);
    while(Q.size())
    {
        u=Q.front();
        Q.pop();
        vis[u]=0;
        for(int i=Head[u]; i!=-1; i=e[i].next)
        {
            v=e[i].v;
            if(dist[v]>dist[u]+e[i].w)
            {
                dist[v]=dist[u]+e[i].w;
                if(!vis[v])
                {
                    vis[v]=1;
                    Q.push(v);
                }
            }
        }
    }
    return dist[n];
}
int main()
{
    int m, a, b, c;
    while(scanf("%d%d", &m, &n)!=EOF)
    {
        memset(Head, -1, sizeof(Head));
        for(int i=0; i<=n; i++)
            dist[i] = INF;
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            Add(a, b, c);
            Add(b, a, c);
        }
        int ans = spfa(1);
        printf("%d
", ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4663315.html