• HDU 2544 最短路 最短路问题


    解题报告:

    这题就是求两个单源点之间的最小距离,属于最短路问题,由于数据量很小,只有100,所以这题可以用弗洛伊德也可以用迪杰斯特拉,都可以过,但是用迪杰斯特拉会快一点,但用弗洛伊德的代码会稍短一点,纯属裸的算法题,这里给出两种算法的代码:

    弗洛伊德算法:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 const int MAX = 0xfffff;
     5 int map[105][105];
     6 int main() {
     7     int N,M,x,y,z;
     8     while(scanf("%d%d",&N,&M)&&(N||M)) {
     9         for(int i = 1;i<=N;++i)
    10         for(int j = 1;j<=N;++j)
    11         map[i][j] = (i==j? 0:MAX);
    12         for(int i  = 1;i<=M;++i) {
    13             scanf("%d%d%d",&x,&y,&z);
    14             map[x][y] = map[y][x] = z;
    15         }
    16         for(int i = 1;i<=N;++i)
    17         for(int j = 1;j<=N;++j)
    18         for(int k = 1;k<=N;++k)
    19         map[j][k] = std::min(map[j][k],map[j][i]+map[i][k]);
    20         printf("%d
    ",map[1][N]);
    21     }
    22     return 0;
    23 }
    24     
    View Code

    迪杰斯特拉:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 const int MAX = 0xffff;
     5 int map[105][105],T[105],visit[105];
     6 int main() {
     7     int N,M,x,y,z;
     8     while(scanf("%d%d",&N,&M)&&(N||M)) {
     9         for(int i = 1;i<=N;++i) {
    10             T[i] = MAX;
    11             for(int j = 1;j<=N;++j)
    12             map[i][j] = MAX;
    13         }
    14         for(int i = 1;i<=M;++i) {
    15             scanf("%d%d%d",&x,&y,&z);
    16             map[x][y] = map[y][x] = z;
    17         }
    18         memset(visit,0,sizeof(visit));
    19         T[1] = 0;
    20         int s = 1;
    21         while(1) {
    22             if(s==N)
    23             break;
    24             for(int i = 1;i<=N;++i)
    25             T[i] = std::min(T[i],T[s]+map[s][i]);
    26             visit[s] = 1;
    27             int Min = MAX;
    28             for(int i = 1;i<=N;++i)
    29             if(!visit[i]&&(T[i]<Min)) {
    30                 s = i;
    31                 Min = T[i];
    32             }
    33         }
    34         printf("%d
    ",T[N]);
    35     }
    36     return 0;
    37 }
    38             
    View Code
  • 相关阅读:
    平均值滤波之经典形式改进
    Matlab编程实例(4) 相位角与相关系数曲线
    Matlab编程实例(3) 函数向左或向右平移N点 左移右移
    Matlab编程实例(2) 同期平均
    Matlab编程实例(1) 移动平均
    使用js在网页上记录鼠标划圈的小程序
    《你不知道的JavaScript》整理(五)——值与原生函数
    Vuex 学习总结
    HTML移动端开发常见的兼容性总结
    一步一步实现字母索引导航栏
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3196286.html
Copyright © 2020-2023  润新知