spfa求负环

news2024/9/21 10:47:27

1.虫洞 Wormholes(裸spfa判断负环问题)

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)icon-default.png?t=N5K3http://ybt.ssoier.cn:8088/problem_show.php?pid=1507

#include<bits/stdc++.h>
using namespace std;
const int N=510,M=5210;
int dist[N],cnt[N];//cnt记录是某个点经过的边数
int e[M],ne[M],h[N],w[M],idx;
bool st[N];
int n,m1,m2;
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool spfa()
{
	queue<int> q;
	
	memset(dist,0,sizeof dist);
	memset(st,0,sizeof st);//初始值可以是任意值,这一步可以不要 
	memset(cnt,0,sizeof cnt);
	for(int i=1;i<=n;i++)
	{
		q.push(i);
		st[i]=true;
	}
	while(q.size())
	{
		int t=q.front();
		q.pop();
		st[t]=false;
		for(int i=h[t];i!=-1;i=ne[i])
		{
			int j=e[i];
			if(dist[j]>dist[t]+w[i])
			{
				dist[j]=dist[t]+w[i];
				cnt[j]=cnt[t]+1;
				if(cnt[j]>=n)return true;//假如边数大于等于n,说有环的存在,而且我们是按照最小距离更新,所有是负环
				if(!st[j])
				{
					q.push(j);
					st[j]=true;
				}
			}
		}
	}
	return false;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m1>>m2;
		memset(h,-1,sizeof h);
		idx=0;
		while(m1--)
		{
			int a,b,c;
			cin>>a>>b>>c;
			add(a,b,c),add(b,a,c);
		}
		while(m2--)
		{
			int a,b,c;
			cin>>a>>b>>c;
			add(a,b,-c);
		}
		if(spfa())puts("YES");
		else puts("NO");
	}
	
}

2.观光奶牛(01分数规划+spfa判断负环)

361. 观光奶牛 - AcWing题库icon-default.png?t=N5K3https://www.acwing.com/problem/content/363/

 

 

 

#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=5010;
int wf[N];
int e[M],ne[M],wt[M],h[N],idx;
double dist[N];
bool st[N];
int cnt[N];
int n,m;
void add(int a,int b,int c)
{
    e[idx]=b,wt[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool check(double  mid)
{
    memset(cnt,0,sizeof cnt);
    memset(st,0,sizeof st);
    queue<int> q;
    for(int i=1;i<=n;i++)
    {
        q.push(i);
        st[i]=true;
    }
    while(q.size())
    {
        int  t=q.front();
        q.pop();
        st[t]=false;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dist[j]<dist[t]+wf[t]-mid*wt[i])
            {
                dist[j]=dist[t]+wf[t]-mid*wt[i];
                cnt[j]=cnt[t]+1; //假如边数大于等于n,说有环的存在,而且我们是按照01分数规划更新,所有是负环
                if(cnt[j]>=n)return true;
                if(!st[j])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return false;
}
int main()
{
    cin>>n>>m;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++) cin>>wf[i];
    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c);
    }
    double  l=0,r=1000;
    while(r-l>1e-4)
    {
        double mid=(l+r)/2;
        if(check(mid))l=mid;
        else r=mid;
    }
    printf("%.2lf",r);
}

3.(单词环)Word Rings

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)icon-default.png?t=N5K3http://ybt.ssoier.cn:8088/problem_show.php?pid=1504

 

 

这题建图很重要,按照前两个字母与后两个来建图然后前两个字母指向后两个字母边权为该字符串的长度

法一:还有建好图还得spfa假如直接跑就容易wa,这时我们可以加个优化,也就是做题经验,当更新次数超过最大输入的边数的2倍,我们就可以认为是有负环的

法二:还有一种优化方法是把循环队列换成栈,这样更快找到负环

 

#include<bits/stdc++.h>
using namespace std;
const int N=700,M=1e5+10;
int e[M],ne[M],w[M],h[N],idx;
double dist[N];
int cnt[N];
bool st[N];
int n,m;
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool check(double mid)
{
	memset(cnt,0,sizeof cnt);
	memset(st,0,sizeof st);
	queue<int> q;
	for(int i=0;i<676;i++)
	{
		q.push(i);
		st[i]=true;
	}
	int count=0;
	while(q.size())
	{
		int t=q.front();
		q.pop();
		st[t]=false;
		for(int i=h[t];i!=-1;i=ne[i])
		{
			int j=e[i];
			if(dist[j]<dist[t]+w[i]-mid)
			{
				dist[j]=dist[t]+w[i]-mid;
				cnt[j]=cnt[t]+1;
				if(cnt[j]>=N)return true;
				if(++count>2*n)return true;
				if(!st[j])
				{
					q.push(j);
					st[j]=true;
				}
			}
		}
	}
	return false;
}
int main()
{
	char str[1010];
	while(cin>>n,n)
	{
		memset(h,-1,sizeof h);
		idx =0;
		for(int i=0;i<n;i++)
		{
			scanf("%s",str);	
			int len=strlen(str);
			if(len>=2)
			{
				int left=(str[0]-'a')*26+str[1]-'a';
				int right=(str[len-2]-'a')*26+str[len-1]-'a';
				add(left,right,len);
			 } 
		}
		
		if(!check(0))puts("No solution");
		else
		{
			double l=0,r=1010;
			while(r-l>1e-4)
			{
				double mid=(l+r)/2;
				if(check(mid))l=mid;
				else r=mid;
			}
			printf("%lf\n",r);
		}
	}
 } 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【花雕】全国青少年机器人技术一级考试试卷模拟题A组

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

kafka入门,高效读写数据,页缓存+零拷贝技术(十七)

高效读写数据 1)kafka本身是分布式集群&#xff0c;可以采用集群技术&#xff0c;并行度高 2&#xff09;读写数据采用稀疏索引&#xff0c;可以快熟定位要消费的数据 3&#xff09;顺序写磁盘 kafka的producer生产数据&#xff0c;要写入到log文件中&#xff0c;写的过程一直…

一个电脑小工具一键转化文件格式《File Converter》

介绍 File Converter是一种软件或在线服务&#xff0c;用于将一个文件格式转换为另一个文件格式。它可以帮助用户在不同的应用程序之间进行文件转换&#xff0c;以便更好地兼容和使用不同的文件类型。 File Converter可以转换各种类型的文件&#xff0c;包括文档、图像、音频…

前端食堂技术周刊第 89 期:ES 2023、MDN Playground、TS 5.2 Beta、逆向分析 GitHub Copilot

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;糯米糍荔枝 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看…

RIP实验

RIP实验 要求&#xff1a; 1、进行地址分配 R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; 2、RIP配置&#xff0c;启动进程&#xff0c;选择版本&#xff0c;宣告网段 R1&#xff1a; R2&#xff1a; R3&…

kubernetes 节点维护 cordon, drain, uncordon

1.这三个命令是正式release的1.2新加入的命令&#xff0c;三个命令一起介绍&#xff0c;是因为三个命令配合使用可以实现节点的维护。在1.2之前&#xff0c;因为没有相应的命令支持&#xff0c;如果要维护一个节点&#xff0c;只能stop该节点上的kubelet将该节点退出集群&#…

“物联网IOT”技术在智能化数据中心低压配电系统中的运用

物联网、区块链、云计算、人工智能等新技术的发展让人们能够用新的方式更方便地获取和管理信息&#xff0c;已成为数字化转型的主要推动力。所谓物联网&#xff08;The Internet of Things&#xff0c;简称IOT&#xff09;&#xff0c;是互联网基础上的延伸和扩展的网络&#x…

python接口自动化(十二)--https请求(SSL)(详解)

简介 本来最新的requests库V2.13.0是支持https请求的&#xff0c;但是一般写脚本时候&#xff0c;我们会用抓包工具fiddler&#xff0c;这时候会 报&#xff1a;requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 小编…

Nginx(7)Nginx实现服务器端集群搭建

Nginx集群搭建 Nginx与Tomcat部署Nginx实现动静分离Nginx实现Tomcat集群搭建 Nginx高可用解决方案KeepalivedKeepalived配置文件keepalived之vrrp_script Nginx制作下载站点Nginx的用户认证模块 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解&#xff0c;我们…

css3 弹性布局flex

文章目录 flex弹性盒子flex-direction 决定主轴的方向flex-wrap 换行flex-flow flex-direction和flex-wrap的简写属性justify-content 定义了弹性子元素在主轴上的对齐方式align-items 定义弹性子元素在交叉轴上如何对齐align-content 定义了多根轴线的对齐方式order 定义弹性子…

网络安全合规-数据安全治理的重要性

数据安全治理能力评估框架将数据安全治理分为三大层次&#xff0c;即数据安全战略、数据全生命周期安全和基础安全[3]。数据安全战略指组织的数据安全顶层规划&#xff0c;起到为数据安全治理“搭框架”“配人手”的作用&#xff1b;数据全生命周期安全指组织在数据全生命周期的…

PDF转换成CAD怎么转换?分享几种快速转换方法

CAD 文件通常具有比 PDF 文件更高的精度。这是因为 CAD 文件是为设计和制造目的而创建的&#xff0c;而 PDF 文件则是为共享和打印目的而创建的。因此&#xff0c;将 PDF 转换成 CAD 可以提高设计的精度和准确性。CAD 文件可以通过精确的尺寸、角度、线型和曲线来描述物体。这使…

c++崩溃调试总结

个人博客地址: https://cxx001.gitee.io windows上程序崩溃调试 场景1 调用第三方dll崩溃 调试需求 需要第三方提供对应的pdb和源码。 调试步骤 把dll 、pdb和exe程序放同级目录。在调用dll崩溃的地方打上断点&#xff0c;F5运行&#xff0c;第一次调试需要选择dll对应源码…

javaweb知识初汇总

前言&#xff1a; 本文主要介绍了JavaWeb前端开发的以下几个方面&#xff1a; 1. HTML/CSS&#xff1a;使用HTML和CSS进行页面结构和样式的设计与布局。 2. JavaScript&#xff1a;使用JavaScript进行页面的交互和动态效果的实现。 3. 前端框架&#xff1a;使用前端框架如V…

CSV文件简单介绍(逗号分隔值Comma-Separated Values)

文章目录 CSV文件CSV文件优点 CSV对比Excel xlsx文件CSV文件应用场景CSV文件使用示例用Python生成CSV文件将Excel文件导出为CSV文件 CSV文件 CSV是逗号分隔值&#xff08;Comma-Separated Values&#xff09;的缩写&#xff0c;是一种常见的电子表格文件格式。CSV文件以纯文本…

【图像处理】去雾源码收集(halcon、python、C#、VB、matlab)

【图像处理】去雾代码收集&#xff08;附halcon、python、C#、VB、matlab源码&#xff09; 一、halcon算法1.1 halcon算法源码1.2 halcon算法效果图![在这里插入图片描述](https://img-blog.csdnimg.cn/8ad5217a59be4de29b5a7b6eee997b85.png#pic_center) 二、opencv算法2.1 py…

对弈人工智能!myCobot 280开源六轴机械臂Connect 4 四子棋对弈

Connect 4 myCobot280 Introduction Hi,guys.今天我们来介绍一下人工智能下棋&#xff0c;我们将用机械臂来作为对手跟你进行下棋。 人工智能下棋的研究可以追溯到20世纪50年代。当时&#xff0c;计算机科学家开始探索如何编写程序&#xff0c;使计算机能够下象棋。其中最著…

【React组件通讯的三种方式】

React组件通讯的三种方式 父组件传递数据给子组件子组件传递数据给父组件 React组件之间的通讯分为三种&#xff1a; 父组件 →子组件子组件 →父组件兄弟组件 父组件传递数据给子组件 步骤&#xff1a; 父组件提供要传递的state数据给子组件标签添加属性&#xff0c;值为st…

Spring Boot 中的分布式配置中心:什么是它,原理及如何使用

Spring Boot 中的分布式配置中心&#xff1a;什么是它&#xff0c;原理及如何使用 在分布式应用程序中&#xff0c;配置管理是一项重要的任务。通常情况下&#xff0c;配置信息被硬编码在应用程序中&#xff0c;这样一来&#xff0c;当应用程序需要相应的配置信息时&#xff0…

$.ajax 怎么进行 json请求

$.ajax请求默认是form表单的格式&#xff0c;这次给到的接口需要的是json的格式&#xff0c;一开始只是将dataType调整为application/json; charsetutf-8&#xff0c;在f12看到的确实是将请求方式改变了&#xff0c;但是参数格式不对劲&#xff0c;应该是个json对象才对 通过查…