【代码超详解】POJ 3268 Silver Cow Party(Dijkstra 算法 + 思维)

博客介绍了如何利用Dijkstra算法解决POJ 3268 Silver Cow Party问题。指出不能使用O(n^3)的Floyd算法,而是通过两次单源最短路径计算,分别从目标点出发和源点出发,来找到最短路径。文章还提到了代码实现中需要注意的两个坑点,包括vis数组的重置和scanf的使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

在这里插入图片描述

二、算法分析说明与代码编写指导

每头牛都会到点 x 参加聚会,然后返回。但路是单向的,因此回去的路可能与来的路不同。
如果对每个点都跑一次 Dijkstra,或者直接跑一次 Floyd 算法,由于复杂度达到 O(n^3),在本题的数据规模下会超时。
从 x 回去的最短路可以直接套 Dijkstra 算法求解单源最短路径。从各点来到 x 的最短路径也只需要跑一次 Dijkstra 就可以求出来,方法是先求出从 x 回去的路,然后将邻接矩阵转置,此时所有边的方向变为相反,然后再以 x 为源点跑一次 Dijkstra 就可以了。可以验证,当其它点到 x 存在双向路径时,这样的处理不会影响结果;当其它点到 x 仅存在单向路径时,从 x 向各点跑单源最短路径得到的到各点的最短路长度与对每个点跑一次最短路得到的长度是一样的。
在这里插入图片描述

三、AC 代码

#include<cstdio>
#include<algorithm>
#include<bitset>
#pragma warning(disable:4996)
using namespace std;
const unsigned tmax = 1 << 30;
unsigned N, n, m, x, u, v, t, G[1001][1001], d1[1001], d2[1001]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值