最短路和次短路问题,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,与源点直接相连的初始化为其权重,其他 ...
随机推荐
- crontab中引入环境变量(比如需要执行tomcat的关闭启动)
起因 crontab中的定时任务,执行到关闭tomcat时,报环境变量找不到 解决方案 1.使用 . /etc/profile 引入环境变量 ###推荐, 实测ubuntu12 成功 2.使用 sou ...
- javascript之ProtoBuf在websocket中的使用
因为ProtoBuf的序列化效率和大小都非常好,所以它在网络通信上面应用越来越多:而webosocket也随着web3.0应用越来越广泛,而将这两个结合在一起的也会慢慢形成一种趋势:本人是为了测试自已 ...
- 【Android Developers Training】 38. 文件共享需求
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- java怎么连接mysql数据库
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Latex加速: TexStudio的安装和使用
TexStudio可以加速Latex的编辑和写作,这里简单介绍一下TexStudio的安装,配置和使用.但是有一个重要的前提,TexStudio会使Latex源代码和pdf文件并排显示,比较占用桌面的 ...
- 关于XML(可扩展标记语言)的基础知识与写法
XML(Extensible Markup Language) HTML:超文本标记语言,主要用来展示 XML:可扩展标记语言,用来做数据传输XML特点:1.树状结构,有且只有一个根2.标签名自定 ...
- ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
一. fp.form.submit 有waitMsg 属性来设置等待效果,如下.但是对于Ext.Ajax.request来说 waitMsg 并不起作用. f ...
- Spring AOP的注解实现
适用场景: 记录接口方法的执行情况,记录相关状态到日志中. 注解类:LogMark.java package com.lichmama.spring.demo.annotation; import j ...
- server
- 学会git玩转github,结尾有惊喜!有惊喜!有惊喜!
一.什么是Github Github是全球最大的社交编程及代码托管网站(https://github.com/). Github可以托管各种git库,并提供一个web界面(用户名.github.io/ ...