poj 3463 dijkstra变形(求最短路和次短路的数量)

最短路计数 题目描述给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。输入输出格式输入格式:输入第一行包含2个正整数N,M,为图的顶点数与边数。 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。输出格式:输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出m 阅读详情

题意:给定一个带权有向图以及起点s和终点t,次短路定义为最短路长度+1,可以不存在。求s到t的最短路和次短路的数量之和。

思路:用到了dijkstra,主要的改变就是数组都开到了二维,第二维用来表示是最短路还是次短路,比如dis[][]数组和visited[][]数组,而num数组使用来存取最短路和次短路的次数,那么最外层的循环就要到2*n-1次了,其中n-1次是用来求最短路的,还有n次是次短路的,然后松弛的条件就要改变了,有四种情况:1.比最短路短2.等于最短路3.长于最短路但短于次短路4.等于次短路(参考http://blog.youkuaiyun.com/sdj222555/article/details/7690694)

#include <stdio.h>
#include <string.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define INF 0x3fffffff
#define N 1005
#define E 10005
struct edge{
	int y,w,next;
}e[E];
int first[N],visited[N][2],dis[N][2],num[N][2];
int top,n,m,T;
void add(int x,int y,int w){
	e[top].y = y;
	e[top].w = w;
	e[top].next = first[x];
	first[x] = top++;
}
int dijkstra(int s,int t){
	int i,j,w,y,now,flag;
	memset(num,0,sizeof(num));
	memset(visited,0,sizeof(visited));
	for(i = 1;i<=n;i++)
		dis[i][0] = dis[i][1] = INF;
	dis[s][0] = 0;
	num[s][0]++;
	for(j = 0;j<(n<<1);j++){
		int min = INF;
		for(i = 1;i<=n;i++)
			if(!visited[i][0] && dis[i][0] < min){
				min = dis[i][0];
				now = i;
				flag = 0;
			}else if(!visited[i][1] && dis[i][1] < min){
				min = dis[i][1];
				now = i;
				flag = 1;
			}
		if(min == INF)
			break;
		visited[now][flag] = 1;
		for(i = first[now];i!=-1;i=e[i].next){
			w = e[i].w;
			y = e[i].y;
			if(min+w < dis[y][0]){
				dis[y][1] = dis[y][0];
				num[y][1] = num[y][0];
				dis[y][0] = min+w;
				num[y][0] = num[now][flag];
			}else if(min+w == dis[y][0])
				num[y][0] += num[now][flag];
			else if(min+w < dis[y][1]){
				dis[y][1] = min+w;
				num[y][1] = num[now][flag];
			}else if(min+w == dis[y][1])
				num[y][1] += num[now][flag];
		}
	}
	return num[t][0]+(dis[t][1]==dis[t][0]+1?num[t][1]:0);
}
int main(){
	freopen("a.txt","r",stdin);
	scanf("%d",&T);
	while(T--){
		int i,a,b,w;
		top=0;
		memset(first,-1,sizeof(first));
		scanf("%d %d",&n,&m);
		for(i = 0;i<m;i++){
			scanf("%d %d %d",&a,&b,&w);
			add(a,b,w);
		}
		scanf("%d %d",&a,&b);
		printf("%d\n",dijkstra(a,b));
	}
	return 0;
}


POJ---3463:Sightseeing【次短路的数量】 题意: 给出一张有向图,求从起点到终点的最短路条数+次短路的条数(如果次短路==最短路+1) 分析: 只需要计算出最短路的条数和距离、次短路的距离和条数,最后判断最短路和次短路的关系即可,在dijkstra求最短路的基础上,加一维保存从起点到该点的最短路和次短路,同时记录相应的数量 如果当前点的最短路或次短路更新了,那么这个点可能松弛其他点,加入优先队列;如果等于最短路或次短路,相应的数量... 阅读详情

相关推荐

Dijkstra算法求最短路和比最短路长1的路径的数目(单源最短路径plus)

题目描述人类和人鱼拥有共同的祖先,因为某种原因发生了分化,人鱼到了大海里生活。近年来人类对大海及生态的破坏,人鱼族的生存环境受到了严重的影响。最近某地产公司筹备一个填海计划,在附近的大海中装入了声呐系统,这极大地限制了人鱼的活动。人鱼族的居民们为了适应环境,建立了n个聚居点(从1到n编号),m条有一定长度的单向通道,每条由一个聚居点通向另一个聚居点。人鱼族派出了美人鱼珊珊去勾引地产公司的老总刘轩,来

ssd_dai的博客 1121

poj 3463 Sightseeing(dij求最短路+次短路(比最短路长1)的总走法)

题目地址 题目大意:给出n个点及m条边,求最短路+次短路的走法总数,次短路比最短路长1 解题思路:我们用一个数组记录最短路,一个数组记录次短路。每次对当前最短边,先更新最短路,更新不了最短路再更新次短路。每条边处理两次,这样就可以在2n×n的复杂度内求得最短路和次短路了。 #include #include #include #include #define inf 20000000

booyoungxu的专栏 656

避坑指南:企业微信IP白名单设置失败的5种常见原因及解决方案

本文深入解析企业微信API调用中IP白名单设置失败的5种常见原因,包括动态公网IP变更、代理服务器导致的IP失真等,并提供针对性的解决方案。特别针对可信IP配置问题,详细介绍了诊断方法和Java代码示例,帮助企业开发者快速解决访问限制问题,确保API调用安全稳定。

weixin_29280657的博客 619

poj3463 最短路+次短路

链接:http://poj.org/problem?id=3463 题意:给定一个图和起点S、终点F,求最短路的数量和比最短路大1的路径的数量。 题解:建立二维dijk数组,分别为最短路和次短路,若最短路比次短路小1,则输出它们的数量。 dis[0][i]描述最短路径,dis[1][i]描述次短路径的长度,way[0][i],way[1][i]分别描述最短路、次短路的数量。 check[0

Ruansf的专栏 676

Prompt Learning 简介

• Prompt Learning 可以将所有的任务归一化预训练语言模型的任务• 避免了预训练和fine-tuning 之间的gap,几乎所有 NLP 任务都可以直接使用,不需要训练数据。• 在少样本的数据集上,能取得超过fine-tuning的效果。• 使得所有的任务在方法上变得一致。

jxsdq的博客 1万+

从零开始用TS开发babylonjs - 本机环境搭建

babylonjs,初始化本地安装,web3d引擎

han3527638的专栏 795

POJ3463 Sightseeing

题目大意:求两点间最短路与长度为最短路长度+1的路径的条数之和。 方法1:最短路径+DP 首先求出ST间最短路径,然后根据递归式记忆化搜索(因此还要构造反向图)。 我们知道到达终点的路径长度最长为maxDist(T)=minDist(T)+1,而与终点相连的节点的路径长度最长为maxDist(T)-Weight(e)。这些节点与更前面的节点也是如此。于是我们从终点开始递归,利用PathCnt...

weixin_30339457的博客 192

微信小程序通过MQTT协议实现智能家居远程控制——基于阿里云物联网平台

本文详细介绍了如何利用微信小程序与MQTT协议,结合阿里云物联网平台,构建一套完整的智能家居远程控制系统。文章从平台配置、MQTT协议核心概念、小程序开发实战到单片机端对接,提供了全链路实践指南,并重点阐述了通过规则引擎实现消息路由与设备绑定的关键步骤,帮助开发者快速实现安全、稳定的自定义智能家居解决方案。

1208

【刷题记录】 POJ-3463 Sightseeing 次短路和最短路

告诉你那n个点以及m条单向边。询问你从s点到e点最短路和比最短路长度大一的路一共有多少条。

这里是阿安的博客 396

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7486

联想服务器ThinkSystemRAID阵列设置教程

关注我不迷路,全是干货! 以联想ThinkSystemSR530为例子进行示范。 开机点按【F1】 点击——【UEFI设置】 依次点击——【系统设置】——【存储】 点击——【RAID卡】 PS:本次服务器配置的是730-8i 阵列卡,按实际情况选中需要设置的阵列卡即可。 点击——【Main Menu】 点击——【Configuration Management】 点击——【Create Virtual Drive】 点击——【Select RAID Leve..

littlelotusK的博客 2万+

POJ 3463 Sightseeing(次短路)

题目链接:http://poj.org/problem?id=3463 题意:给出一个无向图,起点S和终点T。设S到T的最短路为X。求S到T的路径中长度为X或者X+1的有多少条? 思路:应该说是Dij的变形。dis[i][0]表示S到i的最短路,dis[i][1]表示S到i的次短路,cnt[i][0]和cnt[i][1]表示相应的条数。那么每次找到一个dis最小的u进行扩展。对于&lt;u,v...

weixin_34242509的博客 139

【Android面试八股文】Android Application为什么是单例?

这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。

字节卷动 532

poj3463 Sightseeing(dijkstra)

题目链接:http://poj.org/problem?id=3463 题意:求最短路和比最短路大1的路条数。 思路:这里只要把dijkstra变形就可以了。一般的dijkstra只是求最短路。而这里求出最短路和次短路 和他们的条数。 思路是一样的,找到一条没访问的最小边,再通过它更新最短距离。 这里也是,只不这里要找2*n-1次 没访问过的最小边 ,因为要找到...

agyohust791263的博客 177

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

POJ 3463 Sightseeing

POJ 3463 Sightseeing最短路变形,次短路 传送门:POJ 题意已知一张图(单向边),起点S和终点F,求从S到F的最短路和比最短路长1的路径的条数之和。思路同时统计最短路和次短路,最后判断:如果次短路长度比最短路大1,那输出和;否则只输出最短路。 dijkstra基本框架不变,距离,方案数,vis数组都开二维,第二维是0或1,表示最短路/次短路。 松弛条件变化: 当前处理的距

P.H.S 328

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ-3463-Sightseeing

题意:找出最短路和比最短路大一个单位的路的条数 分析:使用K短路算法会超内存,因此看完题解,要使dij变形解决问题 记录最短路和次短路,和最短路的条数和次短路的条数。 dij松弛的条件改变下,有四种情况 1.比最短路短2.等于最短路3.长与最短路但短于次短路4.等于次短路 View Code #include <iostream> #include <cstd...

weixin_30646505的博客 102

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj 3463(最短路、次短路计数)

题意:给出一个有向图、源点、终点,求出源点到终点的最短路径和比最短路径长度大1的路径条数。 思路:求出最短路径条数和次短路径条数,如果次短路比最短路长度大一,返回最短路径和次短路径的条数和。否则返回最短路径条数。 实现:dist[i][2]表示点i到源点的两条路径长度,cnt[i][2]表计数,用dijstra的贪心思想对状态进行更新,与求最短路不同的是,次短路也需要入队和更新。 状态更新如...

weixin_30699741的博客 194

POJ3463

Problem: Sightseeing Description: 给你一个有向图。现在问你最短路的条数和比最短路长度大一的路径条数一共是多少。 Solution: 通过这个题目,熟悉了求解最短路和次短路的长度和条数的方法,真正理解了迪杰斯特拉。我们在用迪杰斯特拉更新disdis的时候要判断小于最短路、等于最短路、小于次短路、等于次短路的情况。仔细画个图就理解了。看代码吧。 Code(C++)

FlushHip 934

通过POJ 3463 Sightseeing(dijkstra)彻底理解优先队列优化的dijkstra算法

先仔细梳理一下优先队列优化的dijkstra算法思路: 我们要定义一个结构体,包含终点v,和从源点到终点v的最短路径长度d struct node { int v, d; node(){} node(int v, int d) :v(v), d(d) {} //由于优先队列的特点重载<操作符,使得d最小的排在队列的front bool operator<(const node&op)

acraz的专栏 504

【算法练习】POJ3463 Sightseeing(最短路与次短路计数)

题意 已知一张图(单向边),起点S和终点F,求从S到F的最短路和比最短路长1的路径的条数之和。 题解 dijkstra维护四个东西,一个是最短距离,一个是次短距离,一个是最短路径的个数,一个是次短路经的个数。 如果用spfa的话(假的spfa),需要上优先队列,每次选距离最小的,这样写的话,就是一个单个顶点能多次入队的dijkstra。不如直接写dijkstra。 代码 #i...

Pengwill's Blog 373

poj3463最短路和次短路计数

题目链接 Description Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to another city F. On this way, the tourists in the bus can ...

weixin_44630656的博客 365

最短路和次短路问题,dijkstra算法

1 /* 2 *题目大意: 3 *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 4 * 5 *算法思想: 6 *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; 7 *将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短路和次短路; 8 ...

417

Dijkstra求最短路与次短路

花了一个晚上加上午两节课的时间来思考这个问题,一开始进了个误区,后来发现不对,找到了正确思路,现在来做个总结 最短路: 假设有如下 无向图: 每条边有权,要求从A到G的最短路,设数组d[i]用来记录每个点到A的最短路,D[][]用来记录权值d[0]=0。先来说一下我一开始的误区,在看了一些介绍这个算法的文章后我大概知道了是要一步一步来更新每个点的最小值。于是我是这样想的从A到B遍历,

qq_25971709的专栏 2705

poj 3463(最短路和比最短路大1的路的数量)(dijkstra)

求最短路和比最短路大1的路的数量 dij松弛的条件改变下,有四种情况 1.比最短路短2.等于最短路3.长与最短路但短于次短路4.等于次短路 具体见代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm&...

weixin_30734435的博客 146
上一篇: poj 3255 spfa(求次短路)
下一篇: poj 1015 dp(陪审团成员的选择)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值