首页 > 编程语言 >floyd算法,三重循环的顺序问题,不要写错了

floyd算法,三重循环的顺序问题,不要写错了

时间:2024-09-05 13:15:23浏览次数:3  
标签:10 dist int LL long 写错 floyd 三重 const

 

最外层的循环应该是,中间节点的变量从1~n:

1     for (k=1;k<=n;k++)
2         for (i=1;i<=n;i++)
3             for (j=1;j<=n;j++)
4                  dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]);

 

 

正确代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned long long
 5 
 6 const LL mod_1=1e9+7;
 7 const LL mod_2=998244353;
 8 
 9 const double eps_1=1e-5;
10 const double eps_2=1e-10;
11 
12 const int maxn=1e3+10;
13 
14 LL dist[maxn][maxn];
15 
16 int main()
17 {
18     LL i,j,k,n,m,u,v,w;
19     cin>>n>>m;
20     for (i=1;i<=n;i++)
21         for (j=1;j<=n;j++)
22             dist[i][j] = 1e15;
23     for (i=1;i<=n;i++)
24         dist[i][i] = 0;
25     for (i=1;i<=m;i++)
26     {
27         cin>>u>>v>>w;
28         dist[u][v] = dist[v][u] = min(dist[u][v], w);
29     }
30     
31     for (k=1;k<=n;k++)
32         for (i=1;i<=n;i++)
33             for (j=1;j<=n;j++)
34                  dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]);
35     //可以经过的点,k=1~n,逐渐递增
36 
37     for (i=1;i<=n;i++)
38     {
39         for (j=1;j<=n;j++)
40         {
41             cout<<dist[i][j];
42             if (j!=n)
43                 cout<<" ";
44             else
45                 cout<<endl;
46         }       
47     }
48 
49     return 0;
50 }
51 /*
52 3 2
53 1 2 1
54 2 3 2
55 */

 

错误代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned long long
 5 
 6 const LL mod_1=1e9+7;
 7 const LL mod_2=998244353;
 8 
 9 const double eps_1=1e-5;
10 const double eps_2=1e-10;
11 
12 const int maxn=1e3+10;
13 
14 LL dist[maxn][maxn];
15 
16 int main()
17 {
18     LL i,j,k,n,m,u,v,w;
19     cin>>n>>m;
20     for (i=1;i<=n;i++)
21         for (j=1;j<=n;j++)
22             dist[i][j] = 1e15;
23     for (i=1;i<=n;i++)
24         dist[i][i] = 0;
25     for (i=1;i<=m;i++)
26     {
27         cin>>u>>v>>w;
28         dist[u][v] = dist[v][u] = min(dist[u][v], w);
29     }
30     
31     for (i=1;i<=n;i++)
32         for (j=1;j<=n;j++)
33             for (k=1;k<=n;k++)
34                  dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]);
35     //dist[1][2] i=1,j=2 一开始被确定 1->k->2 但是这样的k不存在,于是dist[1][2] = 初始设置的最大值
36 
37     for (i=1;i<=n;i++)
38     {
39         for (j=1;j<=n;j++)
40         {
41             cout<<dist[i][j];
42             if (j!=n)
43                 cout<<" ";
44             else
45                 cout<<endl;
46         }       
47     }
48 
49     return 0;
50 }
51 /*
52 3 2
53 1 2 1
54 2 3 2
55 */

 

错误样例:

 

 

dist[1][2] i=1,j=2 一开始被确定 1->k->2 但是这样的k不存在,于是dist[1][2] = 初始设置的最大值

 

 input:

5 10
4 3 7
1 4 7
2 3 9
5 4 8
3 2 2
2 5 2
2 3 8
4 5 3
1 4 5
3 4 1

 

output:

0 8 6 5 8
8 0 2 3 2
6 2 0 1 4
5 3 1 0 3
8 2 4 3 0

 

 

制造样例:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned long long
 5 
 6 const LL mod_1=1e9+7;
 7 const LL mod_2=998244353;
 8 
 9 const double eps_1=1e-5;
10 const double eps_2=1e-10;
11 
12 const int maxn=1e3+10;
13 
14 int a[maxn];
15 
16 int main()
17 {
18     int n,m,v_max=10,i,j,k;
19     srand(time(NULL));
20     
21     //先创建一棵树
22     //crayon ?
23 
24     //n=5;
25     //m=10;
26 
27     n=4;
28     m=8;
29 
30     cout<<n<<' '<<m<<endl;
31 
32     for (i=1;i<=n;i++)
33         a[i]=i;
34     random_shuffle(a+1,a+n+1);
35 
36     for (i=2;i<=n;i++)
37     {
38         j=rand()%(i-1)+1;
39         
40         cout<<a[i]<<' '<<a[j]<<' '<<rand()%v_max+1<<endl;
41     }
42 
43     for (i=1;i<=m-n+1;i++)
44     {
45         j=rand()%n+1;
46         while (1)
47         {
48             k=rand()%n+1;
49             if (k!=j)
50                 break;
51         }
52         cout<<j<<' '<<k<<' '<<rand()%v_max+1<<endl;
53     }
54 
55     return 0;
56 }

 

 

 

 

标签:10,dist,int,LL,long,写错,floyd,三重,const
From: https://www.cnblogs.com/cmyg/p/18398203

相关文章

  • AcWing854. Floyd求最短路
    注意:Floyd是求图里面任意两个点x,y之间的最短距离#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=210,INF=1e9;intn,m,Q;intd[N][N];voidfloyd(){//枚举1~k个中间节点,尝试通过这几个点中转来达到更短......
  • 微软的Phi-3.5系列发布三重威胁
    微软通过新的Phi-3.5系列在AI领域迈出了新的一步,提供了三种为不同任务设计的最先进模型。这些模型不仅功能强大,而且用途广泛,使开发人员能够轻松处理从基本编码到复杂问题解决,甚至视觉任务。无论您是使用有限资源,还是需要高级的人工智能功能,Phi-3.5系列模型都能满足您的......
  • Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
    说明Dijkstra:适用于权值为非负的图的单源最短路径,用斐波那契堆的复杂度O(E+VlgV)BellmanFord:适用于权值有负值的图的单源最短路径,并且能够检测负圈,复杂度O(VE)SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处......
  • 算法板子:最短路问题——包含朴素Dijkstra算法、堆优化版的Dijkstra算法、SPFA算法、Fl
    目录1.几种算法的用途2.Dijkstra算法——求源点到其他所有点的最短路径(不能处理负边权)(1)朴素Dijkstra算法——适用于稠密图(2)堆优化版的Dijkstra算法——适用于稀疏图4.SPFA算法——求源点到其他所有点的最短路径、判断是否存在负环(可以处理负边权)(1)求有负边权的图......
  • 代码随想录算法训练营第64天 | 图论:Floyd 算法+A * 算法
    97.小明逛公园https://kamacoder.com/problempage.php?pid=1155Floyd算法精讲https://www.programmercarl.com/kamacoder/0097.小明逛公园.html#floyd-算法精讲Floyd算法精讲问题总结:双向道路;路径规划;多个起点到多个终点核心思想:动态规划确定dp数组和下标含义:grid......
  • 智能体时代:Agent开发的三重境界
    在人工智能领域,Agent开发是一个不断演进的过程,它涉及到如何将AI技术与实际应用相结合,以提高效率、增强用户体验和推动业务发展。本文将探讨Agent开发的三个阶段,从基础的API使用到复杂的智能应用开发,逐步深入,帮助读者理解Agent开发的深层含义。引言随着人工智能技术的飞......
  • Studying-代码随想录训练营day62| Floyd 算法精讲、A*算法精讲(A star算法)、最短路算法
    第62天,完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★*,最后的两个算法学习,编程语言C++目录Floyd算法精讲A*算法精讲(Astar算法) A*算法 复杂度分析 A*算法的缺点最短路算法总结篇 图论总结深搜和广搜并查集最小生成树 拓扑排序 最短路算法 总结 Floyd算法精讲......
  • Floyd-Warshall
    Floyd-WarshallFloyd-Warshall算法的核心思想是利用动态规划的思想,通过逐步更新距离矩阵来求解所有节点对之间的最短路径。它适用于解决图中节点对数量较小且权重可以为负的情况。时间复杂度为O(n^3)。java代码模板staticfinalintINF=Integer.MAX_VALUE;//graph中......
  • Luogu P1613 跑路 题解 [ 蓝 ] [ 倍增 ] [ Floyd 最短路 ] [ 状压 dp ]
    跑路:绝佳倍增好题,思路是化\(2^k\)为\(1\),倍增起预处理作用。最近不知道是撞了什么运,前一脚看的是绿题,写完之后交一发,发现直接被lxl升蓝了,血赚。思路:Floyd首先观察到每次走\(2^k\)的代价为\(1\),我们可以预处理出每次走\(2^i\)能到哪些点。但为了让这题的代码更好实......
  • 排序 floyd 拓扑排序
    //排序.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///**https://www.acwing.com/problem/content/345/给定n个变量和m个不等式。其中n小于等于26,变量分别用前n的大写英文字母表示。不等式之间具有传递性,即若A>B且B>C,则A>C。请从前往后遍......