- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#define inf 99999999
#define vertex 5
#define edge 6
int main(){
int dis[vertex]={
0,inf,inf,inf,inf
};
int bak[vertex];
int u[edge],v[edge],w[edge];
int i,
k,
check = 0,
flag = 0,
count = 0;
for(i = 0 ;i<edge;i++){
scanf("%d %d %d\n",&u[i],&v[i],&w[i]);
}
// test if data is received correctly
for(i = 0 ; i<edge;i++){
printf("%d %d %d\n",u[i],v[i],w[i]);
}
//test_end
for(k = 0 ;k<vertex-1;k++){ // relax at most vertex-1 time
count ++;
/* check = 0; */
/* for(i = 0 ;i<vertex ;i++){ */
/* bak[i] = dis[i]; */
/* } */
for(i = 0 ;i<edge;i++){
if(dis[v[i]] > dis[u[i]] + w[i]){
dis[v[i]] = dis[u[i]] + w[i];
}
}
/* for(i = 0;i<vertex;i++){ */
/* if(bak[i] != dis[i]){ */
/* check = 1; */
/* break; */
/* } */
/* } */
/* if(check == 0){ */
/* break; */
/* } */
}
// test if have negative circle
for(i = 0 ; i< edge ;i++){
if(dis[v[i]] > dis[u[i]] + w[i])
flag = 1;
}
//test_end
if(flag == 1){
printf("Have circle\n");
}
else{
printf("No circle\n");
for(i = 0 ; i< vertex;i++){
printf("%d ",dis[i]);
}
}
printf("\ncount = %d \n",count);
return 0;
}
这是我的测试数据:
1 2 2
0 1 -3
0 4 5
3 4 2
2 3 3
3 1 -3
结果在我的电脑中:
1 2 2
0 1 -3
0 4 5
3 4 2
2 3 3
3 1 -3
No circle
0 -3 -1 2 4
count = 4
但是,这个加权有向图确实有一个负圆圈。
I misunderstanding the conception of negative circle. What I said above was nonsense. This test weighted digraph contains no negative circle.
然后我画了一幅画:
圆是1->2->3->1
但是程序没有报告。
分析最后的数据:
3 1 -3
//下面的代码是测试是否有负圆。符号 i 已经迭代到 5
if(dis[v[i]] > dis[v[i]] + w[i]){
flag = 1;
}
//dis[1] now is -3 ,
//dis[3] now is 2 ,
//w[5] is -3
-3 > 2 + (-3) 为假!
这就是问题所在,
如果我把3->1的权重设置为-100,算法就可以检测到负圆。
1 2 2
0 1 -3
0 4 5
3 4 2
2 3 3
3 1 -100
Have circle
count = 4
那么Bellman-ford就是这种本性吗?
最佳答案
是的,Bellman–Ford 算法总能检测到负循环。如果存在负循环(例如,当您将 3->1 设置为 -100 时),该图不包含最短路径,因为您始终可以留在循环中并获得更多负值。
参见例如Wikipedia .
关于algorithm - Bellman-ford 算法是否总能检测到加权有向图中的负圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30421179/
我最近在学习图形算法,在我的大学里我们被教导,Bellman-Ford 的结果是一个所有节点到所有其他节点的距离表(所有对最短路径)。但是我不明白这个算法是如何实现的,并试图通过观看 YouTube
一 点睛 如果遇到负权边,则在没有负环(回路的权值之和为负)存在时,可以采用 Bellman-Ford 算法求解最短路径。该算法的优点是变的权值可以是负数、实现简单,缺点是时间复杂度过高。但是该算法可
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 1 年前。 Improve this qu
我正在阅读 Robert Sedgewick 编写的《算法》一书中的 Ford-Fulkerson maxflow 算法。这里作者提到如下 The number of augmenting paths
我对 Ford-Fulkerson 算法的分析结果不正确。例如,采用下图: _____>4___>_ | | 0--->1---->3------6 |
这是我的代码: #include #include #define inf 99999999 #define vertex 5 #define edge 6 int main(){ int d
我尝试编写 bellman-ford 算法,但我发现它不起作用。问题是,我(和我问过的任何人)都找不到错误,我认为这一定很简单。起初它似乎是正确的,因为对于我使用它的每个示例,它都很好用,但对于一些更
在具有 V 个节点和 E 条边的有向图中,Bellman-Ford 算法将每个顶点(或者更确切地说,从每个顶点发出的边)松弛 (V - 1) 次。这是因为从源到任何其他节点的最短路径最多包含 (V -
关于 Ford Fulkerson使用路径 s-x-y-z-t 的算法,我们必须找出如何增加沿该路径的流量。 我遇到的问题是,我不知道如何获取解决方案中的值。 谁能解释一下? 最佳答案 为了在 For
因此,如果我尝试使用 Bellman Ford 算法找到最短路径,使用此方法来测试是否存在路径: public boolean hasPath(int v){ return distTo[v]
我想在流网络 G 的所有最小割中找到积分容量,包含最少边数的容量。我们怎样才能修改 G 的容量以创建一个新的流网络 G',其中任何最小值G'中的割是G中边数最少的最小割。来源-Cormen 最佳答案
假设有一个有100-Vertexes 的有向图,例如V_1---> V_2 ---> ... ---> V_100 所有边的权重都是 1。我们想使用 Bellman-Ford 算法找到顶点 1 (V_
是否每个图都有边的顺序,以便在根据此顺序运行 Bellman-Ford 算法的单次迭代后,每个顶点都标有它到源的最短路径? 我很确定答案是肯定的,但我想不出能够找到边顺序的算法,谢谢 =] 最佳答案
我正在学习 Ford Fulkerson 算法,但我对向后边缘的用途以及它们如何帮助我们达到最大流量感到困惑。我已经观看了几个不同的视频并阅读了一些关于该算法的文档,但没有任何点击。也许这里有人可以用
我一直在搜索 Bellman-Ford 算法的空间复杂度,但是在 wikipedia Bellman-Ford Algorithm 上它说空间复杂度是 O(V)。在 this link它说 O(V^2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
Suppose that we redefine the residual network to disallow edges into s. Argue that the procedure FOR
我不知道还有什么地方可以发布这个问题,我只想知道我是否正确地进行了跟踪。我得到了这张图 问题是: Show the trace of the Bellman-Ford algorithm on the
假设我们想使用 Bellman-Ford 来最小化 max_i x_i - min_i x_i 在变量 x_1, x_2, ... x_n 上(总共 n 个变量) 受到形式为 x_i - x_j <=
我正在尝试从 CLRS 实现 Bellman Ford 算法,它似乎在距离度量上随机溢出。我的代码如下: private void initSingleSource(Vertice source) {
我是一名优秀的程序员,十分优秀!