最短路基础

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\n",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\n",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\n",maps[1][n]);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(最短路)