当前位置: 首页 > 知识库问答 >
问题:

如何在图G中打印负循环?

颜镜
2023-03-14

如何在有向加权图中找到负循环。我知道Bellman-Ford算法是如何工作的,它告诉我是否存在可达到的负循环。但它没有明确地命名它。

如何获得循环的实际路径v1,v2,…vk,v1?

在应用标准算法后,我们已经进行了n−1次迭代,不可能有进一步的改进。如果我们仍然可以降低到节点的距离,则存在负循环。

假设edge(v, u)是bellman ford算法在第n次迭代中失败的边缘-d(u)

共有1个答案

庄子平
2023-03-14

为了解决这个问题。。我们使用贝尔曼福特算法。为了打印循环,我们将节点的父节点存储在向量(par)中。也可能有多个循环,所以在第n次迭代中,我们会找到-ve循环。因此,我们制作一个访问数组,并转到循环的开始,而不是使用par(父向量),我们可以找到循环的路径。我的代码可以帮助你

#include <bits/stdc++++.h>
#include <iostream>
using namespace std; 
#define ll long long 
int main(){
    int n,m;
    cin>> n>>m;
    vector<vector<pair<int,ll int > >>graph(n+1);
    for(int i=0;i<m;i++){
       ll int a,b,c;
       cin>> a>> b>> c;
       graph[a].push_back({b,c});
    }

    vector<ll int >dist(n+1,1e14),par(n+1,-1);

    // applying bellman ford algo.

    for(int i=1;i<n;i++){
       for(int j=1;j<=n;j++){
           for(auto k:graph[j]){
                ll int node=k.first,c=k.second;
                if(dist[node]>c+dist[j]){
                    dist[node]=c+dist[j];
                    par[node]=j;
                }
           }
       }
    }


    // checking nth iteration 


    bool flag=false;
    for(int i=1;i<=n;i++){
       for(auto k:graph[i]){
          ll int node=k.first,c=k.second;
          if(dist[node]>c+dist[i]){
             dist[node]=c+dist[i];
             par[node]=i;
             flag=true;
          }
            
          if(flag){

            // negative cycle founded
            
            cout<<"YES cycle founded"<<endl;

            vector<int >ans;
            vector<bool>vis(n+1,false);


            //  loop for finding the start of cycle
            while(!vis[i]){
                vis[i]=true;
                i=par[i];
            }

            
            // pushing the nodes of path in vector(ans).

            int u=i;
            ans.push_back(u);
            u=par[u];
            while(u^i){
                ans.push_back(u);
                u=par[u];
            }
            ans.push_back(u);
            reverse(ans.begin(),ans.end());


            //printing path

            for(auto z:ans)cout<<z<<" ";
            return 0;
            }
       }
    }   

    if(!flag)cout<<"NO cycle founded"<<endl;
}

问题链接-https://cses.fi/problemset/task/1197/

 类似资料:
  • 我有一个无向图,它被加载为邻接矩阵。我有一个使用BFS算法检测图中循环的方法。我试图实现的是打印所有的边缘,以一种方式,他们表明一个循环,已经找到。 我可以打印一个图形中的所有边,但我不能只打印那些创建循环的边。我怎么让它工作? 边缘: 图表: 节点: 当前错误输出:显示一个周期的部分边沿,但不是全部边沿 预期输出:打印创建循环的所有边,如上面的示例所示, 我想显示:一条边的结束顶点是循环中另一条

  • 我在一个自定义的帖子类型中有3种不同的分类法。我想打印所有的职位与任期名称与他们。 分类学1= 分类学2= 分类学3= 因此,我想用术语名称打印所有自定义文章我可以通过输入单个分类法打印数据,但如何使用所有分类法术语打印数据 查询 结束结果,我想在后循环

  • 我们可以用这里所述的算法求有向图中的圈数。我需要理解算法。 (1)最后那句话到底有什么用处?对algo的工作原理进行简短的描述会很有帮助。由于算法基本上是统计从一个节点返回到同一节点的周期数,所以我们可以使用另一个数组,称之为v,并做以下技巧: (2)我不能实现我刚才写的算法。这是主要的问题,但我认为我需要理解上面的(1)来理解打印所有循环的代码。 我了解到互联网上有算法,我正在尝试使用这个算法。

  • 问题内容: 我必须在热蓝牙打印机上打印一些数据,我正在这样做: 它适用于文本,但不适用于图像。我想我需要获取byte[]图像数据。我尝试通过这种方式获取图像数据: 不幸的是,打印机打印了许多奇怪的字符(大约50厘米的纸张)。我不知道如何打印图像。 我想尝试获取位图的像素,然后将其转换为a byte[]并发送,但是我不知道该怎么做。 谢谢 更新: 经过这么长时间,我正在执行此操作:我有一个名为pri

  • 问题内容: 我想用Java制作图像,然后在尺寸为150 x 100毫米的标签上的300dpi标签打印机上打印。如何制作图像,以便将线条(或任何种类的元素)准确地打印在位置(10,10)(以毫米为单位),并在位置(10,50)处结束? 换句话说:我的挑战不是如何制作一条线(我使用的是Graphics2D,bufferedImage),而是如何准确地知道该行在标签上的位置(以毫米为单位)。 有任何想法

  • 问题内容: 我正在尝试将我的网站转换为ElectronJS制作的应用程序 在我的网站上,我会打印带有条形码的div。这工作得很好,但是在electronjs中我无法达到这个目的。 本来我会用这个功能 与electronicjs 我不知道如何传递对象进行打印。 我也试图从我可以加载的内容生成PDF。但PDF损坏 有一种简单的方法可以用electronjs打印DIV? 感谢您的阅读。 问题答案: 加载