最短路 Hdu-2544

╰半夏微凉° 2022-08-11 16:45 243阅读 0赞

题意很明确,找出1-n的最短距离。

1.dijkstra algorithm

该算法主要思想类似prim algorithm ,但是二者也有细微的差别。其差别请参考:ZH奶酪。

它们都是通过更新一个距离数组来求得答案,都可以用邻接矩阵和邻接表存储距离,而且都要更新完毕n-1个点,它们之间的路也都可以是单向路…..

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int inf=0x3f3f3f3f;
  7. const int N=105;
  8. int dis[N],mat[N][N],vis[N];
  9. int initial(int n){
  10. for(int i=0;i<=n;i++)
  11. for(int j=0;j<=n;j++)
  12. mat[i][j]=inf;
  13. memset(vis,0,sizeof(vis));
  14. }
  15. void dijkstra(int n){
  16. int min=inf,coor=0;vis[1]=1;
  17. for(int i=2;i<=n;i++)
  18. {
  19. dis[i]=mat[1][i];
  20. if(dis[i]<min){
  21. min=dis[i];coor=i;
  22. }
  23. }
  24. vis[coor]=1;
  25. int coun=n-1;
  26. while(coun--){
  27. min=inf;int tmp=0;
  28. for(int i=2;i<=n;i++){
  29. if(!vis[i]){
  30. if(dis[i]>dis[coor]+mat[coor][i]){
  31. dis[i]=dis[coor]+mat[coor][i];
  32. }
  33. if(dis[i]<min){
  34. min=dis[i];tmp=i;
  35. }
  36. }
  37. }
  38. coor=tmp;
  39. vis[coor]=1;
  40. }
  41. }
  42. int main(){
  43. int n,m,x,y,val;
  44. //freopen("shortest_way.txt","r",stdin);
  45. while(scanf("%d%d",&n,&m)==2&&n&&m){
  46. initial(n);
  47. for(int i=0;i<m;i++)
  48. {
  49. scanf("%d%d%d",&x,&y,&val);
  50. mat[x][y]=val;
  51. mat[y][x]=val;
  52. }
  53. dijkstra(n);
  54. printf("%d\n",dis[n]);
  55. }
  56. return 0;
  57. }

2.floyd algorithm

时间复杂度较上一个算法高了一些,但是取而代之的优点是简单易写,代码读起来也十分清楚。其实floyd的代码空间复杂度本是O(|v|^3)但是经过优化就变成了O(|v|^2),其本来的关系式为floyd[i][j][k]=min(floyd[i][j][k-1],floyd[i][k][k-1]+floyd[k][j][k-1],优化后为floyd[i][j]=floyd[i][k]+floyd[k][j]这就是常见的floyd的常见关系式。具体的请看:弗洛伊德算法

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int N=105;
  7. const int inf=0x3f3f3f3f;
  8. int floyd[N][N];
  9. int main()
  10. {
  11. int n,m;
  12. while(scanf("%d%d",&n,&m)==2&&n&&m)
  13. {
  14. int x,y,val,i,j;
  15. for(i=0;i<=n;i++)
  16. for(j=0;j<=n;j++)
  17. floyd[i][j]=inf;
  18. for(i=0;i<m;i++){
  19. scanf("%d%d%d",&x,&y,&val);
  20. floyd[x][y]=val;
  21. floyd[y][x]=val;
  22. }
  23. for(int k=1;k<=n;k++)
  24. for(i=1;i<=n;i++)
  25. for(j=1;j<=n;j++){
  26. if(floyd[i][j]>floyd[i][k]+floyd[k][j])
  27. floyd[i][j]=floyd[i][k]+floyd[k][j];
  28. }
  29. printf("%d\n",floyd[1][n]);
  30. }
  31. return 0;
  32. }

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 2544 短路 Dijkstra

    滴,集训第二十四天打卡。 今天是图论基础,除了并查集是之前在TOJ做过的,其他对我而言都是新题目呀... 这里放一题最短路,等会转一篇大佬的各种最短路模板。 HDU 25