poj 3259 spfa/bellman判断负圈(虫洞)

【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法) Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高。而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编程难度上都比其他算法有优势。 Bellman-Ford算法流程分为三个阶段: 第一步:数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为INF, Dis... 阅读详情

题意:判断有向连通图(图中有重边)中是否存在负权环。给定N个点,M条双向正权边,W条单向负权边。

思路:用bellman或者spfa均可。在bellman算法中的表述为:在求出经过了n-1条边的最短路dist[k]之后,再对每条边<u,k>判断一下:加入这条边是否会使得顶点k的最短路径值再缩短,即判断:dist[u]+w(u,k)<dist[k] 是否成立,如果成立,则说明存在从源点可达的负权值回路。

在spfa中的表述为:若一个点最短路被改进的次数达 到n ,则有负权环。

bellman版本:

#include <stdio.h>
#include <string.h>
#define N 522
int T,n,m,w,edgenum;
struct edge{
	int x,y,w;
}e[N*N/2];
int dis[N];
int bellman_ford(){
	int i,j;
	for(i = 0;i<n-1;i++){
		for(j = 0;j<edgenum;j++){
			if(dis[e[j].x]+e[j].w < dis[e[j].y]){

				dis[e[j].y] = dis[e[j].x]+e[j].w;
			}
		}
	}
	for(j = 0;j<edgenum;j++){
		if(dis[e[j].y] > dis[e[j].x]+e[j].w)
			return 1;
	}
	return 0;
}
int main(){
	//freopen("a.txt","r",stdin);
	scanf("%d",&T);
	while(T--){
		int i,x,y,len;
		edgenum = 0;
		memset(dis,0,sizeof(dis));
		scanf("%d %d %d",&n,&m,&w);
		for(i = 0;i<m;i++){
			scanf("%d %d %d",&x,&y,&len);
			e[edgenum].x = x;
			e[edgenum].y = y;
			e[edgenum++].w = len;	
			e[edgenum].x = y;
			e[edgenum].y = x;
			e[edgenum++].w = len;	
		}
		for(i = 0;i<w;i++){
			scanf("%d %d %d",&x,&y,&len);
			e[edgenum].x = x;
			e[edgenum].y = y;
			e[edgenum++].w = -len;	
		}
		if(bellman_ford())
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

spfa版本:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
using namespace std;
#define INF 0x3fffffff
#define N 1005
struct edge{
    int y,next,w;
}e[5205];
int first[N],top,dis[N],num[N],used[N];
int T,n,m,k;
queue<int> q;
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 relax(int x,int y,int w){
    if(dis[y] > dis[x]+w){
        dis[y] = dis[x]+w;
        return 1;
    }
    return 0;
}
int spfa(){
    int i,now;
    q.push(1);
    for(i = 2;i<=n;i++)
        dis[i] = INF;
    dis[1] = 0;
    memset(num, 0, sizeof(num));
    memset(used, 0, sizeof(used));
    used[1] = 1;
    while(!q.empty()){
        now = q.front();
        q.pop();
        used[now] = 0;
        for(i = first[now];i!=-1;i=e[i].next){
            if(relax(now,e[i].y,e[i].w) && !used[e[i].y]){
                used[e[i].y] = 1;
                q.push(e[i].y);
                num[e[i].y]++;
                if(num[e[i].y] == n)
                    return 1;
            }
        }
    }
    return 0;
}
int main(){
    scanf("%d",&T);
    while(T--){
        int i,a,b,w;
        while(!q.empty())
            q.pop();
        memset(first, -1, sizeof(first));
        top = 0;
        scanf("%d %d %d",&n,&m,&k);
        for(i = 1;i<=m;i++){
            scanf("%d %d %d",&a,&b,&w);
            add(a,b,w);
            add(b,a,w);
        }
        for(i = 1;i<=k;i++){
            scanf("%d %d %d",&a,&b,&w);
            add(a,b,-w);
        }
        if(spfa())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


Linux----Ubuntu系统官网下载iso镜像文件 阅读详情

相关推荐

基于STM32的HC-SR04超声波模块测距(新手级)

本人是嵌入式新手,学习了STM32的部分内容,最近想找些项目做,然后顺便学习了一下HC-SR04超声波模块,学习过程中也参考了一些大佬的文章。本文记录了自己的学习方法和学习过程,同时也希望能和各位大佬交流讨论。

weixin_63758495的博客 2203

Bellman_Ford 算法 | POJ 3259 虫洞(Bellman-Ford算法 · 板子题)

需求 对于解决单源最短路的问题,Dijkstra 是一个很好的方法,但是解决不了对于含有负权图的问题,所以 Bellman_Ford 算法就可以完美的解决这个问题。 个人思考 学完 Dijkstra 算法后,再学习Bellman_Ford算法的时候,是有点懵的,因为对于这个过程了解的不是很清楚,再加上学完之后做的题目的问题更是让我栓Q了,今天总算是基本明白了。 核心代码 对于一条边a -> b,边权为w for(k = 1; k <= n - 1; k++) for(i = 1; i &

qq_53142276的博客 804

oracle19c 无备份情况下重建ocr 和 votedisk

无备份情况下重建ocr 和 votedisk – 19c 备注:测试环境基本上都有ocr自动备份文件,建议参考有备份情况下恢复ocr和votedisk Deconfigure and reconfigure entire cluster will rebuild OCR and Voting Disk, user resources (database, instance, service, ...

fangang001的专栏 4172

虫洞(bellman)

接下来 M 行,每行三个整数,空格分隔:S、E、T,分别描述:存在点 S 到点 E 的双向路径,单程花费 T 秒。接下来 W 行,每行三个整数,空格分隔:S、E、T,分别描述:存在点 S 到点 E 的单向路径,能够令进入者回到 T 秒之前。对地图2,你可以沿闭环 1→2→3→1 行进,在他出发之前回到出发地 1。虫洞非常奇特,它是一条单向路径,可以在进入虫洞之前的某个时间内将你送到目的地!从某个区域开始,你通过一些路径和虫洞,在他出发前一段时间回到起始场地。对地图 1,你并不能穿越到出发之前。

一个不懂编程的编程大佬,当一个人面对疾风,走上前去当一个逆行者,才是卫国黑客(AI终将代替人类) 620

Aspice的理解

ASPICE 是由汽车行业的主要公司和组织合作开发的,包括德国汽车工业联合会(VDA)和国际汽车工作组(Automotive SIG)。其目标是通过标准化的软件开发流程,提高汽车电子系统的软件质量和可靠性。

hkj8808的博客 2013

C# 原生数字孪生的尝试

本文介绍了使用C#实现数字孪生的基本思路。首先从爱普生官网下载机器人3D模型,然后通过Blender创建并导出带动画的FBX模型。在WPF项目中,使用HelixToolkit.SharpDX等插件加载模型,通过Viewport3DX进行3D渲染。关键点是通过动画控制器接收真实设备信号来驱动模型动画,实现物理实体与虚拟模型的同步。文中提供了完整的代码实现,包括模型导入、动画播放控制等核心功能。该方法为构建数字孪生系统提供了一种可行的技术方案。

qq_33529095的博客 1329

ACM_最短路讲解

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中,假...

知足常乐的博客 1643

新华DCS系统仿真测试方法详细介绍

新华DCS ICAN3.1系统是应用广泛并且功能非常强大的国产DCS系统。具有管理虚拟CPU并仿真运行的功能。并且上位机画面可以与虚拟DPU数据实时同步仿真。具体仿真方法如下所示: 1、 需要设备及软件: 2、步骤如下: 2.1硬件步骤: 1)电脑开机。 2)交换机连接电脑网卡。 3)交换机上电运行。 2.2软件步骤: 1)设置电脑IP 一般配置IP为A网工程站IP。 222.222.221.201/255.255.255.0 2)建立虚拟DPU 登录 D:\iCAN\Program\Vxcu 文件夹。

lw_waston的博客 6888

POJ3259 - Wormholes(连通图判断负环)

题目链接; http://poj.org/problem?id=3259 题目大意: 给出N个图,每个图有两种边,一个是无向的正权边,一种是有向的负权边,保证所给的图为连通图,求是否存在负环。 解题过程: 刚开始以为给出的图不连通,然后用Floyd超时,后来问了学长,翻了下POJ的讨论,发现大家都是默认为图连通做的…… 然后敲了下Bellma...

weixin_38166560的博客 189

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

汽车ECU诊断刷写和OTA升级中的验签和校验

汽车ECU诊断刷写和OTA升级中的验签和校验

天赐好车的博客 615

poj3259 Wormholes【Bellman-Ford或 SPFA判断是否有负环 】

题目链接:poj3259 Wormholes 题意:虫洞问题,有n个点,m条边为双向,还有w个虫洞(虫洞为单向,并且通过时间为倒流,即为负数),问你从任意某点走,能否穿越到之前。 贴个SPFA代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 ...

dhe56357的博客 184

用urdf给自己的ROS小车编写模型

3.3 使用urdf编写自己的ROS小车模型 3.3.1 常见的ROS小车结构有哪些? 下面就是常见的ROS小车,相信在大家的脑海里已经有了自己小车的样子,下面我和大家一起使用urdf对ros小车建模。 这里只对urdf进行简单介绍,然后就带大家使用urdf最基础的标签,建立机器人的urdf机器人模型。关于更多细节,请参看官网:http://wiki.ros.org/urdf/Tutorials 3.3.2 什么是urdf?建模的原因? 什么是urdf? URDF(Unified Robot Descri

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

POJ3259 Wormholes(虫洞)(Bellman-floyd法解决)

题目大意:农夫FJ喜欢在自己的农场里面玩穿越,而虫洞-----就是就是一种是时间倒退的时光机(单向的)(A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole!)  但

muxi@Achilles的专栏 2136

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

poj 3259 最短路判负环 spfa算法和Bellman_ford算法

题目:http://poj.org/problem?id=3259 题意: 有个人在一个图上旅行,当它从一点出发后,可能会经过一些虫洞边,然后时光倒流,回到原点,看到自己,看了好久样例一才看清题意,他必须要看到“自己”,也就是要有个负环回路,所以这就是个求负环回路的问题 分析: spfa算法和Bellman_ford算法都可以 spfs代码: #include #include

01的世界 588

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

POJ 3259 Wormholes(bellman_ford、Floyd、SPFA判断负环)

POJ 3259 http://poj.org/problem?id=3259 题意: 农夫 FJ 有 N 块田地【编号 1...n】 (1<=N<=500) 田地间有 M 条路径 【双向】(1<= M <= 2500) 同时有 W 个孔洞,可以回到以前的一个时间点【单向】(1<= W <=200) 问:FJ 是否能在田地中遇到以前的自己 算法:bel...

橘嘉禾 282

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

poj 3259 Wormholes(判断负环)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 44782   Accepted: 16496 Description While exploring his many farms, Farmer John has discovered a nu

CillyB的博客 1198

POJ 3259 Wormholes 最短路SPFA 判断负环

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 65435   Accepted: 24390 Description While exploring his many farms, Farmer John has discovered a number of amaz...

紫芝的博客 540

POJ 3259 Bellman_ford,SPFA

** 1.题意: ** 在探索他的许多农场,农场主约翰发现了一些惊人的虫洞。虫洞非常特殊,因为它是一种单向路径送你到目的地之前进入虫洞!每个FJ农场由N (1≤N≤500)字段方便编号1 . .N, M(1≤≤2500)路径,和W W(1≤≤200)虫洞。 FJ穿越时光的狂热粉丝,他想做以下几点:开始在一些领域,通过一些路径和虫洞旅行,回到起始时间他最初的离开。也许他将能够满足自己:)。 帮助F...

qq_44744457的博客 158

POJ3259 Wormholes(虫洞)(SPFA解决)

题目大意&&思路:农夫玩穿越,找负环经典问题, 思路一:SPFA轻松撸过:原理:某一个节点入队n次的话则存在负环。(200ms) 思路二:Bellman-floyd 也OK:http://blog.youkuaiyun.com/kg_second/article/details/7888273   (其实在这道题思路二更快125ms,SPFA在数据大的时候才霸气尽出)   AC program: #

muxi@Achilles的专栏 1491

poj3259 判断负权回路(spfa和bellman-ford)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 62665   Accepted: 23388 Description While exploring his many farms, Farmer John has discovered a number of amaz...

ecjtu_17_TY的博客 391

Wormholes POJ - 3259(spfa / Bellman-ford判断负环)

While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that i...

smilng的博客 217

Wormholes(POJ 3259)

~题目链接~ http://poj.org/problem?id=3259 Sample Input 2 3 3 1 1 2 2 1 3 4 2 3 1 3 1 3 3 2 1 1 2 3 2 3 4 3 1 8 Sample Output NO YES 题目:输入农田个数,连通的路数,虫洞的个数。两农田之间连通是双向的,而虫洞是单向的。虫洞有这样的性质:...

ddn220120的博客 193

poj-3259(判断负权回路)

Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 86103 Accepted: 31845 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that

qq_45880043的博客 1078

POJ3259(最经典的SPFA)

POJ3259【Wormholes】Description:While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its

This is Mendez. 920

【POJ 3259】Wormholes(最短路SPFA/Bellman_Ford)

DescriptionWhile exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a t

Ice_Confuse 1237
上一篇: HDU 2896/3065 病毒侵袭(AC自动机)
下一篇: poj 3256 dfs水(牛要聚会)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值