Algorithm 从固定节点以最低成本到达节点的方法数

Algorithm 从固定节点以最低成本到达节点的方法数,algorithm,graph,dynamic-programming,dijkstra,Algorithm,Graph,Dynamic Programming,Dijkstra,在带有m(m>n)双向边的加权图中有n个节点(1,2..n) 所有权重均为正,并且没有多条边 有一个固定原点(节点1)。我们将永远从原点开始旅行 现在,我们必须找到以最低成本到达每个节点(从原点开始)的方法(路径)的数量 (所有计数的路径都应具有从原点到达该节点的最低成本) 输入-第一行包含n,m 接下来的m行包含u、v、w=>在权重w(w>0)的u和v之间有一条边 输出-为除原点以外的每个节点打印n-1行,其中包含以最低成本到达每个节点(从原点开始)的方式数 样品试验- 4.5 1 2 5 1

在带有m(m>n)
双向边的
加权图中有n个节点(1,2..n)

所有权重均为
,并且
没有多条边

有一个固定原点(节点1)。我们将永远从原点开始旅行

现在,我们必须找到以最低成本到达每个节点(从原点开始)的方法(路径)的数量

(所有计数的路径都应具有从原点到达该节点的最低成本)

输入-第一行包含n,m

接下来的m行包含
u、v、w
=>在权重w(w>0)的u和v之间有一条边

输出-为除原点以外的每个节点打印n-1行,其中包含以最低成本到达每个节点(从原点开始)的方式数

样品试验-

4.5

1 2 5

13

3 2 2

347

2 4 5

输出-

二,

一,

三,

这是我的解决方案,请检查这是否适用于所有情况,我做了
Dijkstra+DP
。我不确定代码的正确性

#define pp pair<int,int>
vector< pp > adj[N]; //List to store graph
int dis[N],dp[N];

int main()
{
  ios::sync_with_stdio(0);
  int i,j,k,m,n,t;
  cin>>n>>m;
  for(i=0;i<m;i++)
  {
   int u,v,w;
   cin>>u>>v>>w;

   adj[u].push_back({w,v});       
   adj[v].push_back({w,v});
  }
priority_queue< pp , vector<pp > , greater<pp> > pq;   //Min Priority Queue
for(int i=0;i<=n;i++) dis[i] = INT_MAX;
dis[1] = 0;
dp[1] = 1;
pq.push({0,1});

while(!pq.empty())
{
  pp tp = pq.top();
  int u = tp.second;
  int d = tp.first;
  pq.pop();
  if(dis[u]<d) continue;       // We have better ans, so continue.

  for(i=0;i<adj[u].size();i++)  // Traversing all the egdes from node u 
    {
      int v = adj[u][i].second;  //Adjacent vertex v .
      int w = adj[u][i].first;
      if(d + w <= dis[v] )
       {
        if(d+w==dis[v])
        dp[v] += dp[u];     //Add the possible ways to the v from u

        if(d + w < dis[v])
          {
           dis[v] = d + w;  
           dp[v] = dp[u];   // Better ans so set it directly.
           pq.push({dis[v],v});  //Better ans found so push it into queue.
          }
       }
    }
 }

 cout<<endl;

 for(int i = 1;i<=n;i++)
 {
   cout<<i<<" dis = "<<dis[i]<<" ways = "<<dp[i]<<endl;
 }
 }
#定义pp对
向量adj[N]//用于存储图形的列表
int dis[N],dp[N];
int main()
{
ios::将_与_stdio同步(0);
inti,j,k,m,n,t;
cin>>n>>m;
对于(i=0;i>u>>v>>w;
形容词[u]。推回({w,v});
形容词[v]。推回({w,v});
}
优先级队列pq;//最小优先级队列

对于(int i=0;i我认为,通过同时计算最小距离和路径数,问题过于复杂了

  • 我想您首先要正常运行dijsktra并计算最小值 一次运行中从源节点到所有其他节点的距离
  • 然后,从节点u->节点将具有现有双向边的当前图形修改为单向边 v、 其中
    distance[v]>=距源节点S的距离[u]
    。这将生成一个带有源节点S的层次图
  • 在此之后,您可以从源节点和 通过添加到达每个父节点的方式数,计算到达该节点的方式数

这可能更适合于。
adj[u].pb({w,v});adj[v].pb({w,v});
你确定这个方法有效吗?比如说,完全有效吗?@NikhilPathania我想,如果我做同样的问题,我只需在两个过程中完成Dijkstra和DP:首先计算所有
dis[]的最小成本
然后使用dp将这些方法与最小成本相加此试用更正新的试用更正周期不适用于StackOverflow。@n.m.好的,我没有阅读此
dp[v]=dp[u];
,很抱歉这是我的错误。我删除了以前的注释以避免混淆