我有一个加权树, 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]]);
}
}
}
程序无法编译,错误如下:
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]]);
我也知道这个程序在计算BFS时是错误的,因为它在到达目标顶点时没有停止。
有人可以帮助我纠正这些错误吗?
答案 0 :(得分:0)
我认为有几个问题:
for(auto i = 0 ; i < adj[ p ].size() ; i++)
您使用p作为adj的索引,但p的类型为pii
。你可能想要p.first,假设这些对具有意义(从,到)if(vis[ adj[ p ][ i ].first ] == false)
:我假设您要检查是否还没有访问过邻居。所以它应该更像这样:vis[adj[p.first][i].second] == false
。访问的索引是adj[p.first][i].second
。我正在检查第二,因为我假设对(<,li)的语义为q.push(adj[ p ][ i ].first);
:您正在推送一个整数,但队列保持类型pii
。由你决定如何改变它。 dist += adj[p][i].second;
:您正在使用该对索引数组。你应该使用索引num += bfs(adj[a[i]],adj[a[j]]);
正如Buckster已在评论中解释的那样,您将vector<pii>
而不是pii
传递给bfs
函数这些只是编译问题。我不确定你的算法是否符合你的预期。您可以使用bfs来计算任意节点之间的距离,但如果它是加权的,则bfs本身不会为您提供最小路径。如果您对最小路径感兴趣,可以使用Dijkstra,前提是权重为正。 Here我有一个bfs实现,你可以检查,如果你想,但它稍微复杂一点,你在这里尝试做什么。