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++;:BFS计算树中每对节点之间的距离_C++_Graph Theory_Breadth First Search - Fatal编程技术网

C++ C++;:BFS计算树中每对节点之间的距离

C++ C++;:BFS计算树中每对节点之间的距离,c++,graph-theory,breadth-first-search,C++,Graph Theory,Breadth First Search,我有一个有N个顶点的加权树,以邻接列表的形式存储。我有M个节点的列表 现在,为了从这棵树中的M个节点列表中计算每对节点之间的距离,我写了以下内容: using namespace std; #define MAX_N (1<<17) #define MAX_V (1<<17) typedef pair<int,int> pii; vector<pii> adj[MAX_V]; bool vis[MAX_N]; //mark the no

我有一个有N个顶点的加权树,以邻接列表的形式存储。我有M个节点的列表

现在,为了从这棵树中的M个节点列表中计算每对节点之间的距离,我写了以下内容:

using namespace std;
#define MAX_N (1<<17)
#define MAX_V (1<<17)

typedef pair<int,int> pii;    
vector<pii> adj[MAX_V];

bool vis[MAX_N]; //mark the node if visited 
ll bfs(pii s,pii d)
{
    queue <pii> q;
    q.push(s);
    ll dist=0;

    vis[ s.first ] = true;
    while(!q.empty())
    {
        pii p = q.front();
        q.pop();
        for(auto i = 0 ; i < adj[ p ].size() ; i++)
        {
            if(vis[ adj[ p ][ i ].first ] == false)
            {
                 q.push(adj[ p ][ i ].first);
                 vis[ adj[ p ][ i ] ] = true;
                 dist += adj[p][i].second;
            }


        }
    }

    return dist;
}

 int main()
 {

        for(int i=0;i<N;i++)
        {
            int v1,v2,l;
            cin>>v1>>v2>>l;
            adj[v1].push_back(make_pair(v2,l));
           //  adj[v2].push_back(make_pair(v1,l));
        }
        int a[M];
        for(int i=0;i<M;i++)
        cin >> a[i];

        int ans=0;


      for(int i=0;i<M-1;i++)
        {
            for(int j=i+1;j<M;j++)
            {
                num += bfs(adj[a[i]],adj[a[j]]);
            }
        }

  }
使用名称空间std;
#定义最大值(1>1);
adj[v1]。向后推(形成成对(v2,l));
//adj[v2]。推回(使成对(v1,l));
}
int a[M];
对于(int i=0;i>a[i];
int ans=0;

对于(int i=0;i我认为有几个问题:

  • for(auto i=0;i
    您正在使用p作为adj的索引,但p的类型是
    pii
    。您可能需要p。首先,假设对有意义(from,to)
  • if(vis[adj[p.first][i]。first]==false)
    :我假设您想检查邻居是否还没有被访问。因此它应该更像这样:
    vis[adj[p.first][i]。second]==false
    。访问的索引是
    adj[p.first][i]。second code>。我之所以检查second,是因为我假设了(from,to)的语义一对一对
  • q.push(adj[p][i]。首先);
    :您正在推送一个整数,但队列保留类型
    pii
    。如何更改取决于您
  • dist+=adj[p][i]。第二;
    :您正在使用该对对对数组进行索引。您应该使用索引
  • 最后,
    num+=bfs(adj[a[i]],adj[a[j]];
    正如Buckster在注释中所解释的,您将
    vector
    而不是
    pii
    传递给
    bfs
    函数

不过,这些只是编译问题。我不确定你的算法是否真的达到了预期效果。你可以使用bfs计算任意两个节点之间的距离,但如果它是加权的,bfs本身不会给出最小路径。如果你对最小路径感兴趣,你可以使用Dijkstra,前提是权重为正。我有一个bfs实现,你可以检查,如果你想的话,但是它比你在这里要做的稍微复杂一点。

bfs
expect
pii
作为参数。
pii
是一个
adj
是一个
向量的数组。所以,
adj[i]
是一个
向量
,您正在尝试使用它作为一个函数的参数,该函数需要
pii
。谢谢。我得到了我想要的。
could not convert 'adj[a[i]]' from 'std::vector<std::pair<long long int, long long int> >' to 'pii {aka std::pair<long long int, long long int>}'
              num += bfs(adj[a[i]],adj[a[j]]);