poj3463 最短路和比最短路长1的路径数
这题需要很好的理解Dij。
在Dij的基础上,每个点多一个次短路的长度和数量进行控制。
那么在队列中,最短路控制时出现n次,次短路控制出现n次。注意松弛条件中val值和最短路、次短路的关系。
这题需要了解的是,对vis[i][0]控制确定每个点的最短路长度,对vis[i][1]控制确定每个点的次短路长度。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define MAXN 10010
#define inf 100000000
int T,n,m,s,t,temp;
int head[MAXN],dis[MAXN][2],vis[MAXN][2],num[MAXN][2];
struct Node{
int a;
int kind;
int len;
friend bool operator <(Node a,Node b)
{
return a.len>b.len;
}
}start,v,tem; struct Edge{
int u,len,next;
}edge[2*MAXN]; int Dijstra(int s,int t)
{
priority_queue<Node> que;
memset(vis,0,sizeof(vis));
for(int i=0;i<MAXN;i++)
{
dis[i][0]=inf;
dis[i][1]=inf;
num[i][0]=0;
num[i][1]=0;
}
while(!que.empty())que.pop();
start.a=s;
start.kind=0;
start.len=0;
que.push(start);
dis[s][0]=0;
num[s][0]=1;
while(!que.empty())
{
v=que.top();
que.pop();
if(vis[v.a][v.kind])continue;
vis[v.a][v.kind]=1;
for(int i=head[v.a];i!=-1;i=edge[i].next)
{
int u=edge[i].u;
int len=edge[i].len;
int val=v.len+len;
if(val<dis[u][0])
{
if(dis[u][0]<dis[u][1])
{
dis[u][1]=dis[u][0];
num[u][1]=num[u][0];
tem.a=u;
tem.len=dis[u][1];
tem.kind=1;
que.push(tem);
}
dis[u][0]=val;
num[u][0]=num[v.a][0];
tem.a=u;
tem.len=val;
tem.kind=0;
que.push(tem);
}
else if(val==dis[u][0])
{
num[u][0]+=num[v.a][0];
}
else if(val<dis[u][1])
{
dis[u][1]=val;
num[u][1]=num[v.a][v.kind];
tem.a=u;
tem.kind=1;
tem.len=val;
que.push(tem);
}
else if(val==dis[u][1])
{
num[u][1]+=num[v.a][v.kind];
}
} }
if(dis[t][0]+1==dis[t][1])
return num[t][0]+num[t][1];
else return num[t][0];
} void addEdge(int v,int w,int c)
{
edge[temp].u=w;
edge[temp].len=c;
edge[temp].next=head[v];
head[v]=temp;
temp++;
}
int main()
{
scanf("%d",&T);
while(T--)
{
temp=0;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
int v,w,c;
scanf("%d%d%d",&v,&w,&c);
addEdge(v,w,c);
}
scanf("%d%d",&s,&t);
int ans=Dijstra(s,t);
printf("%d\n",ans);
}
return 0;
}
poj3463 最短路和比最短路长1的路径数的更多相关文章
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- [模板] 次短路 | bzoj1726-[Usaco2006Nov]Roadblocks第二短路
简介 所谓次短路, 顾名思义, 就是第二短路. :P 1到n的次短路长度必然产生于:1到x的最短路 + edge(x,y) + y到n的最短路 简单证明一下: 设 \(dis(i,j)\) 表示 \( ...
- CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数
题意: 给出n个点m条公路k条铁路. 接下来m行 u v w //u->v 距离w 然后k行 v w //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...
- 最长绝对文件路径——算法面试刷题1(google),字符串处理,使用tree遍历dfs类似思路
假设我们通过以下的方式用字符串来抽象我们的文件系统: 字符串"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"代表了: dir subdir1 su ...
- 最长的文件路径 Longest Absolute File Path
2018-07-30 22:05:52 问题描述: 问题求解: 本题个人感觉还是挺有意思的,题目要求的是最长的文件路径,其实是需要keep tracking路径长度,如果出现文件则需要进行比较,看是否 ...
- The Super Powers UVA 11752 分析分析 求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。
/** 题目:The Super Powers UVA 11752 链接:https://vjudge.net/contest/154246#problem/Y 题意:求无符号长整形以内的数满足至少可 ...
- [luogu] P4551 最长异或路径(贪心)
P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...
- luoguP4551最长异或路径
P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...
- LeetCode 687. Longest Univalue Path 最长同值路径 (C++/Java)
题目: Given a binary tree, find the length of the longest path where each node in the path has the sam ...
随机推荐
- MATLAB的神经网络工具箱介绍
一.使用matlab2010b以后的版本会有完整的神经网络工具箱,使用nnstart可以调出toolbox,然后选择需要的功能,导入数据,选择训练参数和每层神经元个数,最后训练会输出网络与结果. 二. ...
- FasfDFS整合Java实现文件上传下载
文章目录 一 : 添加配置文件 二 : 加载配置文件 1. 测试加载配置文件 2. 输出配置文件 三:功能实现 1.初始化连接信 ...
- Typescript变量声明
let 和 const 是 javascript 里面最新的变量声明方式,let 与 var 很相似,而 const 是 let 的增强,能阻止对一个变量的再次赋值. var 声明 弱类型:var 声 ...
- [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA
考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...
- 使用Spring Boot快速构建基于SQLite数据源的应用
为了提供一个单包易部署的服务器应用,考虑使用Spring Boot,因为其集成了Apache Tomcat,易于运行,免去绝大部分了服务器配置的步骤. 项目初始化 首先从mvn archetype:g ...
- 位图索引(Bitmap Index)的故事
您如果熟悉Oracle数据库,我想您对Thomas Kyte的大名一定不会陌生.Tomas主持的asktom.oracle.com网站享誉Oracle界数十年,绝非幸致.最近在图书馆借到这位Oracl ...
- python连接数据库异步存储
当同步写入数据库时,可能会发生下载速度很快,但是写入速度很慢的情况,因此我们采用异步存储写入数据库. 实现异步写入mysql数据库的思路: 1,将数据库的连接数据写入到settings文件中,供后面自 ...
- 寻人启事(O(∩_∩)O哈哈~)
注:本文纯属扯淡,如有雷同,纯属巧合! 寻人启事格式 1:标题 标题通常在第一行中央写上<寻人启事>.<寻找XXX>或<寻XXX))等字样. 2:正文 正文一般须包括 ...
- DVWA笔记之三:CSRF
CSRF与XSS不同,它称为跨站请求伪造,它是利用其他页面的恶意脚本来加载访问或操作存在CSRF的漏洞的可信网站. 1.Low级别 核心代码如下: <?php if( isset( $_GET ...
- 神经网络与深度学习笔记 Chapter 6之卷积神经网络
深度学习 Introducing convolutional networks:卷积神经网络介绍 卷积神经网络中有三个基本的概念:局部感受野(local receptive fields), 共享权重 ...