L2-001:dijskstra + 多条最短路径 + 记录中间路径
题目链接: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 + 多条最短路径 + 记录中间路径的更多相关文章
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
- [转]SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定
对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感 谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当 ...
- MS SqlSever一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】[转]
对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...
- 增加一条新记录,同时返回其自增id
方法一.是在Insert或Update触发器中用select来返回需要的字段值.默认情况下,当insert时,触发其insert触发器,它的默认返回值是影响到的行数,语句是:select @@rowc ...
- K条最短路径算法(KSP, k-shortest pathes):Yen's Algorithm
参考: K最短路径算法之Yen's Algorithm Yen's algorithm 基于网络流量的SDN最短路径转发应用 K条最短路径算法:Yen's Algorithm 算法背景 K 最短路径问 ...
- MYSQL:随机抽取一条数据库记录
今天我们要实现从随机抽取一条数据库记录的功能,并且抽取出来的数据记录不能重复: 1.首先我们看文章表中的数据: 2.实现功能代码如下: 1 /** * 获取随机的N篇文篇 * @param int $ ...
- SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】
对普通开发人员来说经常能接触到上千万条数据优化的机会也不是很多,这里还是要感谢公司提供了这样的一个环境,而且公司让我来做优化工作.当数据库中的记录不超过10万条时,很难分辨出开发人员的水平有多高,当数 ...
- 什么是域名的TTL值? ——一条域名解析记录在DNS缓存服务器中的存留时间
什么是域名的TTL值? 转自:http://hizip.net/index.php/archives/20/TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间.当各地的 ...
- oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号、姓名、工资、部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002年3月5日”,部门号为50。 – –如果存在多个名“Smith”的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号L。
一.思路:首先判断这个查询的是emp表,需要接收值,声明一个rowtype类型接收数据即可,第二是,存在exception,需要处理,exception中有两种异常,分别处理即可,分别输出即可. 二. ...
随机推荐
- PKCS#1
ASN.1 syntax,octet string是一个8 bytes sequence string. RSA中涉及到的Data conversion: 1)I2OSP,Integer to Oct ...
- 爬取笔下wenxue小说
import urllib.request from bs4 import BeautifulSoup import re def gethtml(url): page=urllib.request. ...
- 改装原生的dialog
改装 dialog 定制 View rootView = LayoutInflater.from(mContext). inflate(R.layout.nfc_tag_name_dialog, nu ...
- html5-常用的通用元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- HDU 1014 Uniform Generator(题解)
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- [博客迁移]探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据
上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...
- C++笔试题2(基础题)
温馨提醒:此文续<C++笔试题(基础题)> (112)请写出下列程序的输出内容 代码如下: #include <iostream> using namespace std; c ...
- flask 文件上传(单文件上传、多文件上传)
文件上传 在HTML中,渲染一个文件上传字段只需要将<input>标签的type属性设为file,即<input type=”file”>. 这会在浏览器中渲染成一个文件上传字 ...
- Vue2.0,Express实现的简单跨域
https://www.cnblogs.com/kevin-zjy-blog/p/7357220.html 1. 通过jsonp跨域2. document.domain + iframe跨域3. lo ...
- vue:vuex详解
一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...