Algorithm 从固定节点以最低成本到达节点的方法数
在带有m(m>n)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
双向边的加权图中有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];
,很抱歉这是我的错误。我删除了以前的注释以避免混淆