我是靠谱客的博主 体贴豆芽,最近开发中收集的这篇文章主要介绍DAG-dp DAG求单源最短距离 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

DAG求单源最短距离

1.题目描述:

上图所示的图为有向无环图(DAG),现在需要求解从结点 s s s出发到达结点 t t t的最短距离。

2.基本思路

由于该图为有向无环图因此其满足最优子结构的性质。定义函数 f ( i ) f(i) f(i),该函数表示从原点出发到达结点 i i i的最短距离。因此我们可以得到以下的递推关系式:
f ( T ) = m i n { f ( C ) + 20 , f ( D ) + 10 } f ( D ) = m i n { f ( B ) + 20 , f ( A ) + 10 , f ( C ) + 5 } . . . f(T)=min { f(C)+20,f(D)+10 } \ f(D)=min {f(B)+20,f(A)+10,f(C)+5 } \ ... f(T)=min{f(C)+20,f(D)+10}f(D)=min{f(B)+20,f(A)+10,f(C)+5}...

3.代码实现

该问题的求解思路为采用拓扑排序的方法,每次处理入度为0的结点 i i i,更新结点 i i i所能到达的结点的当前最短距离,然后更新过后的结点入度均减1,直到最后完成整个拓扑排序的过程,输出到达终点的距离。

在实现代码的时候需要维护好以下的信息:
与结点 i i i相邻的结点信息,结点之间的权重,从起始结点出发到达当前结点的最短距离。

#include <iostream>
#include <map>
#include <vector>
#include <queue>
#define N 101
using namespace std;
map<char,vector<char>> Near;//维护与每个结点相连的结点的信息
map<char,map<char,int>> TD;//记录两两结点之间的距离
map<char,int> Dis;//记录从起点到当前结点的距离
map<char,int> degree;//记录每个结点的入度
queue<char> Q;//存储入度为0的结点
int main()
{
char c1,c2;
int w=-1;
while(cin>>c1>>c2>>w){
if(w==0)break;//以边权为0做为输入的结束条件
Near[c1].push_back(c2);
TD[c1][c2]=w;
degree[c2]+=1;
}
for(auto it=degree.begin();it!=degree.end();it++){
if(it->second==0){
Q.push(it->first);
}
Dis[it->first]=123123123;
}
Dis['s']=0;
Q.push('s');//其实结点入队
while(!Q.empty()){
char tmp = Q.front();
Q.pop();
for(int i=0;i<Near[tmp].size();i++){
Dis[Near[tmp][i]]=min(Dis[Near[tmp][i]],Dis[tmp]+TD[tmp][Near[tmp][i]]);
degree[Near[tmp][i]]--;
if(degree[Near[tmp][i]]==0)
Q.push(Near[tmp][i]);
}
}
cout<<"The minimum distance from s to t is:"<<Dis['t']<<endl;
return 0;
}
/*
INPUT:
s a 10
s b 20
a c 30
a d 10
b d 20
c d 5
c t 20
d t 10
0 0 0
OUTPUT:
The minimum distance from s to t is:30
*/

最后

以上就是体贴豆芽为你收集整理的DAG-dp DAG求单源最短距离 的全部内容,希望文章能够帮你解决DAG-dp DAG求单源最短距离 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部