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 ...
随机推荐
- 数据结构与算法--KMP算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- cve-2017-0199&metasploit复现过程
CVE-2017-0199 WORD/RTF嵌入OLE调用远程文件执行的一个漏洞.不需要用户交互.打开文档即中招 首先更新msf到最新,据说最新版简化了利用过程,不需要开启hta这一步.但没测成功 还 ...
- Java中基本数据类型和包装类
参考:深入剖析Java中的装箱和拆箱; Java中基本数据类型和包装类互转中 缓冲机制的使用; java学习笔记:装箱和拆箱,包装器和缓冲池 Java 各 类型数据在内存中分配情况详解 一 java内 ...
- vue指令v-show示例解析
v-show控制元素显示或者隐藏: <div id="app"> <p v-show="isShow">this is a messag ...
- pip&easy_install使用
pip install ... easy_install ... ******************************************************************* ...
- POI通过模板导出EXCEL文件
一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中 ...
- Aleta病毒
文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份 ...
- python——变量
参考资料: Python程序设计与实现 变量名的命名规则 仅仅由大.小写英文字母,下划线(_),数字(不可作为变量名的开头)组合而成: 不能使用Python关键字和函数名作为变量名: 变量名不能包含空 ...
- SpringMVC创建HelloWorld程序
1.IDE说明和依赖管理工具说明 开发工具:intellij idea 依赖管理使用:maven 2.创建maven工程 创建新的maven工程,并添加相应的文件夹,创建好的项目目录如下所示: 3.添 ...
- [UWP]了解模板化控件(5.2):UserControl vs. TemplatedControl
1. UserControl vs. TemplatedControl 在UWP中自定义控件常常会遇到这个问题:使用UserControl还是TemplatedControl来自定义控件. 1.1 使 ...