最短路和次短路问题,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,与源点直接相连的初始化为其权重,其他 ...
随机推荐
- [命令行] curl查询公网出口IP
转载:http://blog.csdn.net/orangleliu/article/details/51994513 不管是在家里还是办公室,或者是公司的主机,很多时候都是在内网中,也就是说很多都是 ...
- linux查询进程号,出现两个进程
[root@ADM01B ~]# ps -ef|grep iesmgr root 5929 5321 0 09:38 pts/7 00:00:00 grep iesmgr root 9798 1 0 ...
- 【Android Developers Training】 43. 序言:管理音频播放
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- MySQL--当mysqldump --single-transaction遇到alter table(2)
在上篇<MySQL--当mysqldump --single-transaction遇到alter table>中测试发现,在MySQL 5.6版本中,如果在mysqldump期间修改表, ...
- vue.js+UEditor集成 [前后端分离项目]
首先,谈下这篇文章中的前后端所涉及到的技术框架内容. 虽然是后端的管理项目,但整体项目,是采用前后端分离的方式完成,这样做的目的也是产品化的需求: 前端,vue+vuex+vue router+web ...
- ARP欺骗分析
(作者原创,欲转载请说明出处)1.arp介绍 arp:地址解析协议;将IP地址映射为MAC地址.2.为什么要有arp 平时上网我们都知道要有一个IP地址才能上网,那arp用来干嘛的呢?如果 ...
- Android可更换布局的换肤方案
换肤,顾名思义,就是对应用中的视觉元素进行更新,呈现新的显示效果.一般来说,换肤的时候只是更新UI上使用的资源,如颜色,图片,字体等等.本文介绍一种笔者自己使用的基于布局的Android换肤方案,不仅 ...
- python新手之2变量
变量 变量是将储存的值保存在内存中.当声明一个变量的时候会在内存中开辟一个储存内容的位置. 基于变量的数据类型,解释器分配内存空间并决定储存的内容.因此我们可以通过变量分配不同的数据类型,可以在变量中 ...
- 【.net 深呼吸】监听剪贴板更新(针对Vista之后系统)
针对 XP 及以前的监视剪贴板更改的方法就不讲了,因为 XP 已严重过时.本篇老周介绍的方法面向 Vista 以上的系统. 在托管应用程序中监听剪贴板更新行为必须用到 Win 32 API ,具体做法 ...
- 面向对象15.3String类-常见功能-转换
public static void main(String[] args) { //2.1// String s="张三,李四,王五";// String [] arr=s.sp ...