Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何生成由原始图的最短路径边组成的新图?_C++_Path_Graph Theory_Dijkstra_Shortest - Fatal编程技术网

C++ 如何生成由原始图的最短路径边组成的新图?

C++ 如何生成由原始图的最短路径边组成的新图?,c++,path,graph-theory,dijkstra,shortest,C++,Path,Graph Theory,Dijkstra,Shortest,几天前,我学习了Dijkstra算法,想学习从原始图生成一个具有最短路径边的新无向图 所以我做的是对Dijkstra最短路径算法做了一个简单的修改 #define ll long long vector <pair<int,long long>> adj[N]; //original graph vector <int> adjj[N]; //new graph with shortest path edges void dijkstra(int s) {

几天前,我学习了Dijkstra算法,想学习从原始图生成一个具有最短路径边的新无向图

所以我做的是对Dijkstra最短路径算法做了一个简单的修改

#define ll long long
vector <pair<int,long long>> adj[N]; //original graph
vector <int> adjj[N]; //new graph with shortest path edges

void dijkstra(int s)
{
    d[s]=0;  // array that stores shortest path
    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq;
    pq.push(make_pair(0,s));
    while(!pq.empty())
    {
        int v=pq.top().S;ll dist=pq.top().F;
        pq.pop();

        if(dist==((long long)(1e18)))
            return;
        if(dist>d[v])
            continue;
        if(p[v]!=0) // considering nodes' number start from 1          
            // new graph made only with shortest paths  
            adjj[parent[v]].push_back(v),adjj[v].push_back(parent[v]); 
        for(auto edge : adj[v])
        {
            int to = edge.first;
            ll len = edge.second;
            if((len+d[v])<d[to])
            {
                parent[to]=v;
                d[to]=len+d[v];
                pq.push(make_pair(d[to],to));
            }
        }
    }
}
#定义ll long
向量adj[N]//原始图
向量adjj[N]//具有最短路径边的新图
迪杰克斯特拉(内景s)
{
d[s]=0;//存储最短路径的数组
优先级队列pq;
pq.推送(形成一对(0,s));
而(!pq.empty())
{
int v=pq.top().S;ll dist=pq.top().F;
pq.pop();
if(dist==((long-long)(1e18)))
返回;
如果(距离>d[v])
继续;
如果(p[v]!=0)//考虑节点数从1开始
//仅使用最短路径生成的新图形
adjj[parent[v].向后推(v),adjj[v].向后推(parent[v]);
用于(自动边缘:调整[v])
{
int-to=edge.first;
ll len=边。秒;

如果((len+d[v])这是正确的。你在这里做的基本上是建立一个搜索树,反映你的算法找到的路径。但是,这棵树通常是定向的,因为它是根树

有几件事值得一提:

  • 您声明了一个从未使用过的
    #define
    ll
  • 您应该有一个
    #define INF
  • 无需测试优先级队列是否会产生无穷大。只有在找到进入队列的路径后,才能将顶点推到队列上