• 最短路径算法学习总结


    Dijkstra最短路径算法:

    dijkstra 算法的优点在于可以求出从一点到所有其他点的最短距离;

    input:

    5 7
    1 2 10
    1 3 20
    1 5 30
    2 5 10
    2 3 5
    4 5 20
    4 3 30

    output:

    0 10 15 40 20//这是求的在这颗树中,1到所有点的最短距离

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 const int N=1100;
     5 const int INF=1000000; 
     6 int map[N][N];
     7 //int p[N];
     8 int vis[N];
     9 int low[N];
    10 int n,m;//代表点的个数和路线的数量 
    11 void Dijkstra(int s)
    12 {
    13     for(int i=1;i<=n;i++)
    14     {
    15     low[i]=map[s][i];
    16     }
    17     low[s]=0;
    18     vis[s]=-1;
    19     int v;
    20     for(int i=1;i<n;i++)
    21     {
    22         int Min=INF;
    23         for(int j=1;j<=n;j++)
    24         {
    25             if(vis[j]!=-1&&low[j]<Min)
    26             {
    27                 Min=low[j];
    28                 v=j;
    29             }
    30         }
    31         vis[v]=-1;
    32         for(int j=1;j<=n;j++)
    33         {
    34             if(vis[j]!=-1&&low[j]>low[v]+map[j][v])
    35             low[j]=low[v]+map[j][v];//不断更新两点间的最短距离 
    36         }
    37     }
    38 }
    39 int main()
    40 {
    41     while(cin>>n>>m)
    42     {
    43         //memset(map,0,sizeof(map));
    44         for(int i=1;i<=n;i++)
    45         for(int j=1;j<=n;j++)
    46         map[i][j]=INF;
    47         memset(vis,0,sizeof(vis));
    48         int a,b,c;
    49         for(int i(1);i<=m;i++)
    50         {
    51         scanf("%d %d %d",&a,&b,&c);
    52         map[a][b]=map[b][a]=c;
    53         }
    54         Dijkstra(1);
    55         for(int i=1;i<=n;i++)
    56         {
    57             cout<<low[i]<<" ";
    58         }
    59         cout<<endl;
    60     }
    61     return 0;
    62 }

    floyd算法:

    floyd算法比较费空间和时间,不适合处理大量数据;

     1 #include<iostream> 
     2 using namespace std;
     3 const int N=300;//这个地方不应该定义的太大,不然会报错
     4 const int INF=11111111;
     5 int main()
     6 {
     7     int dis[N][N];
     8     int n,m;//分别代表点的数量和路线的条数 
     9     while(cin>>n>>m)
    10     {
    11         for(int i=1;i<=n;i++)
    12         for(int j=1;j<=n;j++)
    13         dis[i][j]=INF;
    14         for(int i=1;i<=n;i++)
    15         dis[i][i]=0;
    16         int a,b,c;
    17         for(int i=1;i<=m;i++)
    18         { 
    19             scanf("%d %d %d",&a,&b,&c);
    20             if(dis[a][b]>c)
    21             dis[a][b]=dis[b][a]=c;
    22         }
    23         for(int k=1;k<=n;k++)
    24         for(int i=1;i<=n;i++)
    25         {
    26             for(int j=i+1;j<=n;j++)
    27             {
    28                 if(dis[i][k]!=INF&&dis[k][j]!=INF&&dis[i][j]>dis[i][k]+dis[k][j])
    29                 dis[j][i]=dis[i][j]=dis[i][k]+dis[k][j];
    30             }
    31         }
    32         int w,u;
    33         scanf("%d %d",&w,&u);
    34         if(dis[u][w]==INF)printf("no solution
    ");
    35         else printf("%d
    ",dis[u][w]);
    36     }
    37     return 0;
    38 }
    What I don't dare to say is I can't!
  • 相关阅读:
    进入Docker 报错
    Oauth一直无限重定向
    jquery.click() not working in iOS
    IOS 系统 form 表单提交的问题;一直当前页面刷新
    Word 搜索功能显示bug
    百度脑图bug
    微信分享链接添加参数后缩略图不显示如何解决?
    微信分享到朋友圈 QQ空间 代码实现
    文献复现 | The support of human genetic evidence for approved drug indications
    生物医药领域 | 知名投资人 | VC | PE | IBD | 公募 | 私募
  • 原文地址:https://www.cnblogs.com/sytu/p/3851718.html
Copyright © 2020-2023  润新知