spfa求负环

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.hqwc.cn/news/7702.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Rust】安装

文章目录 1.官网下载2.安装3.安装验证4.打开本地文档5.安装插件6.HelloWorld①新建项目目录使用VSCode打开②新建rs文件③编译④运行 7.HelloCargo①新建项目目录使用VSCode打开②cargo build③cargo run④cargo check⑤为发布构建 8.更新与卸载 1.官网下载 官网地址&#xff…

基于单片机智能手环心率老人防跌倒心率体温 步数里程

功能介绍 以STM32单片机作为主控系统&#xff1b; OLED液晶显示心率体温步数等信息&#xff1b;通过按键设置心率、体温上限设置&#xff1b;当心率或者体温超过按键设置上限蜂鸣器进行声光报警提醒&#xff1b;通过wifi模块esp8266把数据发送到手机端进行显整个电路以5v供电&a…

消息中间件应用场景

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…

探秘高逼格艺术二维码的制作过程-AI绘画图生图

在之前的文章《AI制作艺术二维码-文生图》中&#xff0c;我介绍了一种直接通过提示词生成高逼格二维码的方法&#xff0c;但是通过提示词我们无法很好的控制生成图片的样式&#xff0c;特别是有些同学想要将自己的Logo或者头像附加到二维码中&#xff0c;要满足这类需求&#x…

Git客户端:Tower for Mac 注册版

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

碳排放预测模型 | Python实现基于机器学习的碳排放预测模型——数据清理和可视化

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于机器学习的碳排放预测模型——数据清理和可视化 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测…

tomcat进程注入

跟随上一篇《java进程注入》 这里使用memShell https://github.com/rebeyond/memShell 将agent.jar和inject.jar放到tomcta的web目录下 然后输入命令注入 效果&#xff1a; 注入成功后 可以看到agent.jar文件为了防止发现&#xff0c;自动清除&#xff0c;而且重启电脑之后&…

SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo 说明项目Demo代码地址项目目录mysql对应表建表语句pom.xmlapplication.yml配置类启动类代码OrderInfo 实体类TestController控制层接口层TestServiceTestServiceImpl实现层TestDao数据接口层dao层对应mapper.xml自定义…

leetcode 226. 翻转二叉树

2023.7.1 这题依旧可以用层序遍历的思路来做。 在层序遍历的代码上将所有节点的左右节点进行互换即可实现二叉树的反转。 下面上代码&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if(root nullptr) return{};que…

【Linux】LVS负载均衡群集 DR模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LVS负载均衡群集 DR模式 数据包流向分析DR 模式的特点LVS-DR中的ARP问题VIP地址相同导致响应冲突返回报文时源地址使用VIP&#xff0c;导致网关设备的ARP缓存表紊乱 DR模式 L…

VUE3笔记

项目结构 模板语法&#xff08;在标签之外&#xff09; 插值语法 &#xff1a;双大括号 属性绑定&#xff08;在标签之内&#xff09; v-bind: 单属性两种写法 多属性绑定 条件渲染 列表渲染 要有key&#xff0c;降低消耗 遍历数组 遍历对象 事件处理 传递参数 事件修…

gerrit 遇到的问题汇总

更新远程代码 git pull --rebase 回退到指定版本 get reset --hard commitid 修改之前的提交 git commit --amend 问题一 本地提交了两个记录到远程&#xff0c;远程还没有合并&#xff0c;本地使用 git reset --soft HEAD~1 回退到了上一个提交&#xff0c;现在需要将本地…