最短路和次短路问题,dijkstra算法
/*
*题目大意:
*在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;
*
*算法思想:
*用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路;
*将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短路和次短路;
*再用一个cnt二维数组分别记录最短路和次短路的条数;
*每次更新路径的条数时,不能直接加1,,应该加上cnt[u][k],k为次短路径或者最短路径的标记;
*图有重边,不能用邻接矩阵存储;
*不知道为什么,题目上说的是N and M, separated by a single space, with 2≤N≤1000 and 1 ≤ M ≤ 10000;
*而我的代码硬是把N开成1W了才过,求解释,RE了无数次,擦;
**/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
const int M=;
const int INF=0xffffff;
struct node
{
int to;
int w;
int next;
};
node edge[N];
int head[N];
int dist[N][],cnt[N][];
bool vis[N][];
int n,m,s,t,edges;
void addedge(int u,int v,int w)
{
edge[edges].w=w;
edge[edges].to=v;
edge[edges].next=head[u];
head[u]=edges++;
}
int dijkstra()
{
int k;
for(int i=; i<=n; i++)
{
dist[i][]=dist[i][]=INF;
vis[i][]=vis[i][]=;
cnt[i][]=cnt[i][]=;
}
cnt[s][]=,dist[s][]=;
for(int i=; i<=n*; i++)
{
int u=-;
int min_dist=INF;
for(int j=; j<=n; j++)
for(int flag=; flag<; flag++)
if(!vis[j][flag]&&dist[j][flag]<min_dist)
{
min_dist=dist[j][flag];
u=j;
k=flag;
}
if(u==-)
break;
vis[u][k]=true;
for(int e=head[u]; e!=-; e=edge[e].next)
{
int j=edge[e].to;
int tmp=dist[u][k]+edge[e].w;
if(tmp<dist[j][])//tmp小于最短路径长:
{
dist[j][]=dist[j][];//次短路径长
cnt[j][]=cnt[j][];//次短路径计数
dist[j][]=tmp;//最短路径长
cnt[j][]=cnt[u][k];//最短路径计数
}
else if(tmp==dist[j][])//tmp等于最短路径长:
{
cnt[j][]+=cnt[u][k];//最短路径计数
}
else if(tmp<dist[j][])//tmp大于最短路径长且小于次短路径长:
{
dist[j][]=tmp;//次短路径长
cnt[j][]=cnt[u][k];//次短路径计数
}
else if(tmp==dist[j][])//tmp等于次短路径长:
{
cnt[j][]+=cnt[u][k];//次短路径计数
}
}
}
int res=cnt[t][];
if(dist[t][]+==dist[t][])//判断最短路和次短路是否相差1
res+=cnt[t][];
return res;
}
int main()
{
//freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
edges=;
scanf("%d%d",&n,&m);
memset(head,-,sizeof(head));
int u,v,w;
for(int i=; i<m; i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
scanf("%d%d",&s,&t);
printf("%d\n",dijkstra());
}
return ;
}
最短路和次短路问题,dijkstra算法的更多相关文章
- 最短路:我的理解--Dijkstra算法
最短路径:Dijkstra算法 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处理存在 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- ACM: HDU 2544 最短路-Dijkstra算法
HDU 2544最短路 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- hdu2544 最短路 Dijkstra算法
最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 最短路(hdu2544)Dijkstra算法二
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 单源最短路:Dijkstra算法 及 关于负权的讨论
描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...
随机推荐
- ajax异步加载遮罩层特效
<!doctype html> <html> <head> <title>遮罩层(正在加载中)</title> <meta chars ...
- Itunes制作手机铃声,图文版
一.下载歌曲,选择歌曲用itunes打开,打开出现下面界面 二.设置歌曲 右键点击歌曲,找到显示简介,点击选项,截取音乐,出现下图: 截取你喜欢的部分,点击确定 点击确定后,选中该歌曲,找到左上方 文 ...
- Generic(泛型)
什么是泛型:"通过参数化类型来实现在同一份代码上操作多种数据类型.利用"参数化类型"将类型抽象化,从而实现灵活的复用". 简单来说泛型就是为了使一些代码能够重复 ...
- stringsteam使用之整型转字符串
最近需要用到整型转字符串的操作,学习了stringstream一些皮毛. 首先需要包含头文件. #include<sstream> 然后用流操作的方式将值传递给stringstream对象 ...
- 【Android Developers Training】 10. 序言:支持不同设备
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- web前端CSS2学习2017.6.17
CSS---表现层,修饰和表现html文档,为了解决结构层和表现层分离的问题. 通过CSS极大的提高了工作效率,方便工作人员维护和管理CSS:层叠样式表,目前用的最广泛的css版本为css2,最新版本 ...
- Java 异常处理笔记
Java程序运行过程中所发生的异常事件可分为两类: §错误(Error):JVM系统内部错误.资源耗尽等严重情况 §违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: ...
- MessageBoxButtons.OKCancel的选择事件
private void 退出ToolStripMenuItem1_Click(object sender, EventArgs e) { DialogResult resault = Message ...
- 2-用EasyNetQ连接RabbitMQ(黄亮翻译)
如果你连接过关系数据库,例如SQL Server.你会发现EasyNetQ处理connections有点奇怪.和关系数据库通讯一直都是通过client开始的.Client 打开一个连接, 发出一个SQ ...
- Apple使用Apache Mesos重建Siri后端服务
苹果公司宣布,将使用开源的集群管理软件Apache Mesos,作为该公司广受欢迎的.基于iOS的智能个人助理软件Siri的后端服务.Mesosphere的博客指出,苹果已经创建了一个命名为J.A.R ...