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 ...
随机推荐
- factorOne cannot be&nb…
factorOne cannot be resolved or is not a field 现象描述: Eclipse的使用时会在代码处出现警告factorOne cannot be resolve ...
- grunt+bower依赖管理
安装bower(必须安装git) npm install bower -g bower按照插件命令 初始化配置 bower init 生成bower.json //如果有bower.json 直接输入 ...
- proxifier配合ss,实现全局代理
proxfixer配合ss的话,基本可以实现全局代理,分应用代理,或者玩外服的游戏(一般的游戏默认不走代理,本软件可以强制应用代理) 由于ss使用的是sockets5代理,一般情况下只有浏览 ...
- table表格中单击添加动态编辑框
var $newNode=$("<input type='text' style='width:250px; height:20px; maxlength='20' id='texti ...
- HTML 贝塞尔曲线
1.二次贝塞尔曲线 <canvas id="myCanvas" width="300" height="150" style=&quo ...
- oracle函数和存储过程有什么区别
oracle函数和存储过程有什么区别 1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数 ...
- css 定位功能position
Static 定位 HTML元素的默认值,即没有定位,元素出现在正常的流中.静态定位的元素不会受到top, bottom, left, right影响. 相对定位Relative相对定位元素的定位是相 ...
- mysql 中的socket 即 mysql.sock的作用
这个mysql.sock应该是mysql的主机和客户机在同一host上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快.通常遇到这个问题的原因就是你的mysql ser ...
- AIX缩小逻辑卷报错chfs: 0506-964
--AIX缩小逻辑卷报错chfs: 0506-964 -----------------------------------------2013/10/29 通过smit chfs/或 chfs命令 ...
- 截取TableView生成图片
先看一下实例效果: 如果所示,这是一个在APP中截图,并调起微信客户端,发送给好友的例子,图片就是一个tableView的截图. 先实现一个小例子,如果tableVIew里面的内容,没有超过当前屏幕显 ...