HDU 2544 最短路( Dijkstra算法 和 Floyd算法)




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





最短路的最简单的题目  入门题目 直接套模板就可以 给出Dijkstra算法和Floyd算法的代码 学习这两个算法可以从这个题目开始



Dijkstra算法:

#include <stdio.h>  
  
const int maxinf=9999999;  
int dist[110];//已求得的最短距离   
int A[110][110];//用于记录各个点之间的距离   
  
  
void Dijkstra(int v0,int n){  
    int S[110];//标记已经求得最短距离的点   
    int u;  
    for (int i=1;i<=n;i++)  
    {  
        dist[i]=A[v0][i];//将各点到源点得距离初始化  有边即为距离 无边为 maxinf   
        S[i]=0;//将所有得点初始化为未求得最短距离   
    }   
      
    dist[v0]=0; //源点到源点得距离为 0    
    S[v0]=1;//标记源点被计算过   
  
      
    for (int i=1;i<=n;i++)  
    {  
        int mindist=maxinf;  
          
        for (int j=1;j<=n;j++)  
        {  
            if (!S[j]&&dist[j]<mindist)// 找到未被计算过并且距离源点距离最短的点   
            {  
                u=j;  
                mindist=dist[j];  
            }  
        }  
          
        S[u]=1;//将该点标记为已被计算   
          
        for (int j=1;j<=n;j++)  
        {  
            if (!S[j]&&A[u][j]+dist[u]<dist[j])//从u的基础上 找到一个未被访问 距离源点最近的点   
            {  
              
                    dist[j]=dist[u]+A[u][j];//保存该点最短距离   
            }   
        }  
          
    }  
  
}  
  
int main (){  
    int N,M;  
    int a,b,c;  
    while (scanf ("%d%d",&N,&M)&&(N||M))  
    {  
                  
        for (int i=1;i<=N;i++)  
        {  
            for (int j=1;j<=N;j++)  
            {  
                A[i][j]=maxinf;//将各个点之间的距离初始化为 无穷大(表示为 maxinf)   
            }  
        }  
          
        for (int i=1;i<=M;i++)  
        {  
            scanf ("%d%d%d",&a,&b,&c);  
            //为两点之间付距离   
            A[a][b]=c;  
            A[b][a]=c;  
        }   
          
        Dijkstra(1,N);  
        printf ("%d\n",dist[N]);  
    }  
    return 0;  
}  




Floyd算法代码:

#include <stdio.h>  
int maxinf=9999999;  
int N,M;  
int map[110][110];//邻接矩阵存储数据   
int dis[110][110];//用于记录最短路   
  
void floyd(){  
    for (int i=1;i<=N;i++){  
        for (int j=1;j<=N;j++){  
            dis[i][j]=map[i][j];  
        }  
    }  
      
    for (int k=1;k<=N;k++){  
        for (int i=1;i<=N;i++){  
            for (int j=1;j<=N;j++){  
                if (dis[i][j]>dis[i][k]+dis[k][j])//在点 i 和 j 之间插入点 k   取之前从i到j的距离 和  插入点k后经过k点 的i到j的距离 小的那个   
                {  
                    dis[i][j]=dis[i][k]+dis[k][j];  
                }  
            }  
        }  
    }  
}  
int main (){  
    int n,m,t;  
    while (scanf ("%d%d",&N,&M)&&(N||M)){  
        for (int i=1;i<=N;i++){  
            for (int j=1;j<=N;j++){  
                if (i!=j)  
                    map[i][j]=maxinf;  
                else  
                    map[i][j]=0;//本身到本身为 0   
            }  
        }  
        while (M--){  
            scanf ("%d%d%d",&n,&m,&t);  
            //两点之间赋距离   
            map[n][m]=t;  
            map[m][n]=t;  
        }  
        floyd();  
        printf ("%d\n",dis[1][N]);  
    }  
    return 0;  
}   


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值