题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

思路:

题意:找最短路径,如果有多条最短路径值相等,找经过的点最多的一条。

dijkstra算出最短路径,在搜寻最短路时更改一下几点:

1.记录中间路径节点

2.更新最短路时,更新点权和,记录当前节点的最短路数量。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int N=555;
int dis[N];//记录最短距离
int path[N];//记录最短路径中间节点
int w[N];
int pathnum[N];//记录最短路径的数目
int tol[N];//记录总路径的边权之和
int book[N];
int mp[N][N];//邻接矩阵
int n,m,s,d; void print(int x)//递归输出路径
{
if(path[x]==-1)
{
printf("%d",x);
return ;
}
print(path[x]);
printf(" %d",x);
return ;
} void dijkstra()
{
memset(book,0,sizeof(book));
memset(tol,0,sizeof(tol));
int i,j;
for(i=0;i<n;i++)
dis[i]=inf;
dis[s]=0;
path[s]=-1;
tol[s]=w[s];//对起始点的初始化
pathnum[s]=1;//起点的最短路径数为1 for(i=0;i<n;i++)
{
int u,minn=inf;
//找到dis路径权值最小的点u
for(j=0;j<n;j++)
{
if(!book[j]&&dis[j]<minn)
{
u=j;
minn=dis[j];
}
}
book[u]=1;
for(j=0;j<n;j++)
{
//更新最短路径 以u去更新它的邻接点
if(dis[j] > dis[u] + mp[u][j])//松弛时各数组的更新
{
dis[j] = dis[u] + mp[u][j];//更新最短路径值 ok
path[j] = u;//记录中间路径 ok
tol[j] = tol[u] + w[j]; //更新最短路径对应下的顶点最大值
pathnum[j] = pathnum[u];//如果dis最短路径的值更新为最大值了 说明是第一次更新,并且是用u去更新的v,所以点j的最短路径数量应该等于u的最短路径数量
}
else if(dis[j] == dis[u] + mp[u][j])//相等时的更新
{
pathnum[j] += pathnum[u];//如果最短路径相等了,说明有这两个点的多种方案都可行,应该是二者最短路径的和 //在距离相同时 比较所有的点权和 更新为最大的点权
if(tol[j] < tol[u] + w[j])//点权值的更新
{
tol[j] = tol[u] + w[j];//更新点权值和
path[j] = u;//改变中间路径
}
}
}
}
} int main()
{
int x,y,z;
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=0;i<n;i++)
scanf("%d",&w[i]);
memset(mp,inf,sizeof(mp));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
mp[x][y]=z;
mp[y][x]=mp[x][y];
}
dijkstra();
printf("%d %d\n",pathnum[d],tol[d]);
print(d);
return 0;
}

L2-001:dijskstra + 多条最短路径 + 记录中间路径的更多相关文章

  1. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

  2. [转]SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感 谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当 ...

  3. MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...

  4. 增加一条新记录,同时返回其自增id

    方法一.是在Insert或Update触发器中用select来返回需要的字段值.默认情况下,当insert时,触发其insert触发器,它的默认返回值是影响到的行数,语句是:select @@rowc ...

  5. K条最短路径算法(KSP, k-shortest pathes):Yen's Algorithm

    参考: K最短路径算法之Yen's Algorithm Yen's algorithm 基于网络流量的SDN最短路径转发应用 K条最短路径算法:Yen's Algorithm 算法背景 K 最短路径问 ...

  6. MYSQL:随机抽取一条数据库记录

    今天我们要实现从随机抽取一条数据库记录的功能,并且抽取出来的数据记录不能重复: 1.首先我们看文章表中的数据: 2.实现功能代码如下: 1 /** * 获取随机的N篇文篇 * @param int $ ...

  7. SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】

    对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...

  8. 什么是域名的TTL值? ——一条域名解析记录在DNS缓存服务器中的存留时间

    什么是域名的TTL值? 转自:http://hizip.net/index.php/archives/20/TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间.当各地的 ...

  9. oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号、姓名、工资、部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002年3月5日”,部门号为50。 – –如果存在多个名“Smith”的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号L。

    一.思路:首先判断这个查询的是emp表,需要接收值,声明一个rowtype类型接收数据即可,第二是,存在exception,需要处理,exception中有两种异常,分别处理即可,分别输出即可. 二. ...

随机推荐

  1. Unity shader学习之轮廓效果

    将物体描一层边可以使游戏看起来具有卡通风格,一种简单的实现方法如下: 将物体渲染2次,即使用2个通道. 第一个通道将顶点沿法线(或中心点到顶点的方向)做一个偏移,即将模型扩大一点,并将颜色渲染成轮廓的 ...

  2. object base基类分析

    uvm_object,是所有uvm data和hierarchical class的基类,实现了copy,compare,print,record之类的函数 扩展类中必须实现create和get_ty ...

  3. <4>Cocos Creator基本概念(场景树 节点 坐标 组件 )

    1.场景树 Cocos Creator是由一个一个的游戏场景组成,场景是一个树形结构,场景由 有各种层级关系的节点(下一节有具有介绍)组成: 如创建一个HelloWorld的默认项目NewProjec ...

  4. ubuntu安装python-mysqldb

    前期准备: sudo apt-get install  libmysqld-dev sudo apt-get install libmysqlclient-dev sudo apt-get insta ...

  5. VM虚拟机配置固定IP

    linux下vmware桥接模式.静态ip上外网的配置 http://blog.csdn.net/zdh_139/article/details/73456654 虚拟机网络改成桥接模式 vi /et ...

  6. 计算属性(computed)、方法(methods)和侦听属性(watch)的区别与使用场景

    1,computed 能实现的,methods 肯定也能够实现. 2,不同之处在于,computed 是基于他的依赖进行缓存的,computed 只有在他的的相关依赖发生改变的时候才会重新计算. 如果 ...

  7. redux 数据规律

    counter increase info  todos 为 reducers 文件名 export default combineReducers({ todos, visibilityFilter ...

  8. Numpy 通用函数

    frompyfunc的调用格式为frompyfunc(func, nin, nout),其中func是计算单个元素的函数,nin是此函数的输入参数的个数,nout是此函数的返回值的个数 # 注:用fr ...

  9. Deprecated: getEntityManager is deprecated since Symfony 2.1

    PHP5.3应用中,登陆后台管理时提示错误: Deprecated: getEntityManager is deprecated since Symfony 2.1. Use getManager  ...

  10. 动手动脑-Java的方法重载

    例: Using overloaded methods public class MethodOverload {  public static void main(String[] args) {  ...