hdu3191 How Many Paths Are There(次短路计数dp)

该博客讨论了如何在图中计算次短路径的问题,采用动态规划的方法。dp数组分别记录节点u的最短路径数量和最短路长度,以及次短路径数量和次短路长度。通过比较当前路径成本与目标节点已有的最短和次短路径,更新路径数量和长度,并根据路径变化情况决定是否将新状态加入队列。
摘要由CSDN通过智能技术生成

次短路好算,这题多了个计数;
dp[u][1],dis[u][1]分别表示到u最短的路径条数和最短路的长度;
dp[u][2],dis[u][2]分别表示到u次短的路径条数和次短路的长度;

if (dis[u][kind] + cost[u][v] < dis[v][1]) 表示可以更新最短,那么同时次短也会被原来的最短所更新掉,产生了两个新状态,都要添加到队列中。
else if (dis[u][kind] + cost[u][v] == dis[v][1]) 表示最短路径增多了。
else if (dis[u][kind] + cost[u][v] < dis[v][2])表示可以更新次短路,状态有改变,需要将新状态添加到队列中。
else if (dis[u][kind] + cost[u][v] == dis[v][2])表示次短路径增多了。

const int maxn = 51;
int dis[maxn][3], dp[maxn][3], mark[maxn][3];
int n, m, st, ed;
struct node {
    int u, dis, kind;
    node() {}
    node(int u,int dis,int kind) : u(u), dis(dis), kind(kind) {}
    bool operator < (const node& rhs) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值