最短路dijkstra,floyd

两点之间的最小距离,dijkstra是计算某个点到其余点的最短路径,而floyd计算任意两点间最短路

感觉两个差不多,对于某两个点a,b之间 的距离,找到一个点c,比较原距离是否大于ac的距离加cb的距离之和,我感觉我还没有深刻的理解,总是觉得会出什么疏漏,然而也找不到解决的方法,摊手,以后再多加理解

两道题输入格式是一样的,参考了hdu2112

/*************************dijkstra

//

//  main.cpp

//  dijkstra

//

//  Created by Mr.Xue on 17/1/18.

//  Copyright © 2017 Mr.Xue. All rights reserved.

//

#include <iostream>

using namespace std;

#define INF 10000

int a[1000][1000],n,d[INF];

void Init()

{

    for(int i=0;i<=150;i++)

    {

        for(int j=0;j<150;j++)

        {

            if(i==j)

                a[i][j]=0;

            else

                a[i][j]=INF;

        }

    }

}

void dijkstral()

{

    int vis[INF];

    memset(vis,0,sizeof(vis));

    for(int i=1;i<=n;i++)

        d[i]=INF;

    d[1]=0;

    for(int i=1;i<=n;i++)

    {

        int temp=INF,x;

        for(int j=1;j<=n;j++)

        {

            if(!vis[j]&&d[j]<temp)

            {

                temp=d[j];

                x=j;

                //printf("%d ",x);

            }

        }

        

        vis[x]=1;

        if(temp==INF)

            break;

        for(int j=1;j<=n;j++)

        {

            if(d[j]>d[x]+a[x][j])

                d[j]=d[x]+a[x][j];

            //printf("%d ",d[j]);

        }

    }

}

int main()

{

    int i,j,s,e,w;

    while(~scanf("%d",&n)&&n!=-1)

    {

        Init();

        scanf("%d %d",&s,&e);

        for(int k=0;k<n;k++)

        {

            scanf("%d %d %d",&i,&j,&w);

            a[i][j]=a[j][i]=w;

        }

        dijkstral();

        for(i=1;i<=n;i++)

            printf("%d ",d[i]);

        printf("\n");

    }

    

    return 0;

}

/*

6

1 2

1 3 60

1 4 30

3 5 20

4 6 10

1 6 50

6 2 10

*/



/**********************/

//  main.cpp

//  floyd

//

//  Created by Mr.Xue on 17/1/18.

//  Copyright © 2017 Mr.Xue. All rights reserved.

//


#include <iostream>

using namespace std;

#define INF 10000

int a[1000][1000],n,d[INF];

void Init()

{

    for(int i=0;i<=150;i++)

    {

        for(int j=0;j<150;j++)

        {

            if(i==j)

                a[i][j]=0;

            else

                a[i][j]=INF;

        }

    }

}

void floyd()

{

    for(int k=1;k<=n;k++)

    {

        for(int i=1;i<=n;i++)

        {

            for(int j=1;j<=n;j++)

            {

                if(a[i][j]>a[i][k]+a[k][j])

                    a[i][j]=a[i][k]+a[k][j];

            }

        }

    }

}

int main()

{

    int i,j,s,e,w;

    while(~scanf("%d",&n)&&n!=-1)

    {

        Init();

        scanf("%d %d",&s,&e);

        for(int k=0;k<n;k++)

        {

            scanf("%d %d %d",&i,&j,&w);

            a[i][j]=a[j][i]=w;

        }

        floyd();

        for(i=1;i<=n;i++)

        {

            for(j=1;j<=n;j++)

            printf("%d ",a[i][j]);

            printf("\n");

        }

    }

    return 0;

}




相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页