有N个城市(编号为0~N-1)、M条道路(无向边),并给出M条道路的距离属性与花费属性。现在给定起点S与终点D,求从起点到终点的最短路径、最短距离及花费。注意:如果有多条最短路径,则选择花费最小的那条

本文介绍了三种算法解决最短路径问题:Dijkstra算法用于精确计算从源节点到目标节点的最短路径,结合DFS进行路径回溯;另一种方法是Dijkstra+DFS,通过预计算最小成本路径;最后是Bellman-Ford算法,适用于存在负权边的情况。

 

题解1(Dijkstra):#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXV=510;
const int INF=1000000000;
int n,m,st,ed,G[MAXV][MAXV],cost[MAXV][MAXV];
int d[MAXV],c[MAXV],pre[MAXV];
bool vis[MAXV]={false};
void Dijkstra(int s){
    fill(d,d+MAXV,INF);
    fill(c,c+MAXV,INF);
    for(int i=0;i<n;i++) pre[i]=i;
    d[s]=0;
    c[s]=0;
    for(int i=0;i<n;i++){
        int u=-1,MIN=INF;
        for(int j=0;j<n;j++){
            if(vis[j]==false&&d[j]<MIN){
                u=j;
                MIN=d[j];
            }
        }
        if(u==-1)return;
        vis[u]=true;
        for(int v=0;v<n;v++){
            if(vis[v]==false&&G[u][v]!=INF){
                if(d[u]+G[u][v]<d[v]){
                    d[v]=d[u]+G[u][v];
              
c++14 ## 题目描述 给定由 $M$ 道路连接的 $N$ 个城市城市编号从 $1$ 到 $N$,道路编号从 $1$ 到 $M$。对于任意两个城市,都存在一系列道路连接这两个城市道路 $i$ 的长度为 $L_i$ 公里,双向连接城市 $A_i$ 城市 $B_i$。每道路的长度均为正数,即 $L_i > 0$。不幸的是,你忘记了每道路的具体长度。 你观察到,对于每道路 $i$,所有在该道路上的人都从 $A_i$ 单向前往 $B_i$。因此,你提出了以下假设: - 存在一个称为 $S$ 的首都城市- 人们从首都城市前往其他城市- 人们尝试沿最短路径移动。因此从 $S$ 到 $A_i$ 的最短路径长度小于等于从 $S$ 到 $B_i$ 的最短路径长度。 当你可以将每道路的长度任意分配为正实数时,能否找到满足件的首都城市 $S$?你可以假设至少存在一个城市满足件。 ## 输入格式 输入的第一行包含两个整数 $N$($2 \le N \le 500$) $M$($N-1 \le M \le \frac{N(N-1)}{2}$)。 接下来的 $M$ 行中,第 $i$ 行给出 $A_i$ $B_i$($1 \le A_i, B_i \le N$)。 输入中不存在自环或重边。形式化地说,$A_i \ne B_i$, $\{A_i, B_i\} = \{A_j, B_j\} \implies i = j$。 ## 输出格式 第一行输出可能的首都城市数量 $K$。 第二行以递增顺序输出 $K$ 个用空格分隔的整数,表示所有可能作为首都的城市。 ## 输入输出样例 #1 ### 输入 #1 ``` 2 1 1 2 ``` ### 输出 #1 ``` 1 1 ```
最新发布
11-28
【题目描述】 Nosknah喜欢收集宝藏,他知道学校的后花园里面藏有 P个珍品。经过严密调查,他知道后花园分成了N块区域,由 M无向路径连接。 Nosknah要从1区域出发,捡完所有的宝藏后从N区域离开。Nosknah没有Hankson那么聪明,他现在助你:他最短走多远就能捡完宝藏离开? 为了简化问题,我们假设Nosknah拿走珍品不需要花费任何时间。 【输入格式】 ​ 第1行两个整数N、M。 第2行到第M+1行,每行三个整数 x、y、w,表示 x、y号区域(1≤x、y≤N)间有一道路,该道路长度为w。 第M+2行一个整数P。 第M+3行有用空格隔开的P 个整数,第i个数Pi代表第i个珍品藏在第Pi个区域。 【输出格式】 ​ 输出仅一个整数,为 Nosknah 拿到所有宝藏离开的所需走过的最短道路长度。如无法全部捡到或者无法离开,输出-1。 【样例输入13 2 1 2 3 2 3 4 1 2 【样例输出1】 7 【样例解释1】 直接按 1→2→3 路线走,可以拿走2区域的珍品,以最短时间7到达3区域(即N号区域)。 【样例2】 ​ 见选手目录下的 g r a p h / g r a p h 2. i n graph/graph2.in g r a p h / g r a p h 2. a n s graph/graph2.ans。 【数据范围及约定】 ​ 对30%的数据,1≤N≤101≤M≤1000≤P≤5。 对100%的数据,1≤N≤2001≤M≤10,0000≤P≤12,道路长度不超过1,000,000,000。 其中,N、M、P、道路长度均为整数。 用记忆化搜索+二进制压缩
04-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超翔之逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值