SPFA找负环(DFS) luogu3385
SPFA找负环的基本思路就是如果一个点被访问两次说明成环,如果第二次访问时所用路径比第一次短说明可以通过一直跑这个圈将权值减为负无穷,存在负环
有bfs和dfs两种写法,看了一些博客,在bfs和dfs间选择了dfs,因为我认为如果整个图是一个环,从一个点开始,在此点对面的一条边为非常大的负权边,这种情况bfs会非常慢
另外还有一个优化,dis初始化为0而非INF,这样舍弃了dis保存最短路径的特性,保证了每次dfs总是从负权边开始,尽管这道题上这个优化并没有什么效果……
// luogu 3385
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x = ,f= ; char ch = getchar();
while(ch<'' || ch>'') {if(ch == '-') f=-;ch = getchar();}
while(ch>=''&&ch<='') {x = x*+ch-'';ch = getchar();}
return x*f;
}
int T,n,m,st,ed,le,flag;
struct EDGE{
int to,next,len;
EDGE(){}
EDGE(int a,int b,int c){
to = a, next = b, len = c;
}
}e[];
int head[],dis[],cnt,vis[];
void init(){
memset(head,,sizeof(head));
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
cnt = ;
flag = ;
}
void add(int u, int v, int w){
e[++cnt] = EDGE(v,head[u],w);
head[u] = cnt;
}
void spfa_dfs(int st){
//cout<<st<<endl;
if(flag) return;
vis[st] = ;
for(int i = head[st];i;i = e[i].next){
int to = e[i].to;
if(dis[st]+e[i].len<dis[to]){
dis[to] = dis[st]+e[i].len;
if(vis[to]){
flag = ;
return;
}
else spfa_dfs(to);
}
}
vis[st] = ;
}
int main(){
T = read();
while(T--){
init();
n = read(); m = read();
for(int i = ;i<m;i++){
st = read(); ed = read(); le = read();
add(st,ed,le);
if(le>=) add(ed,st,le);
}
for(int i = ;i<=n;i++){
if(flag) break;
spfa_dfs(i);
}
if(flag) printf("YE5\n");
else printf("N0\n");
}
return ;
}
SPFA找负环(DFS) luogu3385的更多相关文章
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...
- Poj 3259 Wormholes(spfa判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...
- LightOJ 1074 Extended Traffic SPFA 消负环
分析:一看就是求最短路,然后用dij,果断错了一发,发现是3次方,有可能会出现负环 然后用spfa判负环,然后标记负环所有可达的点,被标记的点答案都是“?” #include<cstdio> ...
- bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 594 Solved: 360[Submit][Statu ...
- spfa判负环
bfs版spfa void spfa(){ queue<int> q; ;i<=n;i++) dis[i]=inf; q.push();dis[]=;vis[]=; while(!q ...
- spfa 判断负环 (转载)
当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
- BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...
- [P1768]天路(分数规划+SPFA判负环)
题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...
随机推荐
- Redis键通知机制
Redis键通知机制 一.概念 自从redis2.8.0以后出了一个新特性,Keyspace Notifications 称为“键空间通知”. 这个特性大概是,凡是实现了Redis的Pub/Sub的客 ...
- rm -rf 误删后该怎么办?
Google有一个开源的包 叫ext3grep工具他可以回复删除的文件,甚至是drop database,想什么呢,数据库啦!这个工具需要在ext3或者ext4 的文件系统上才可以实现,因为ext3文 ...
- PYTHON指定国内PIP源
一.LINUX: vi ~/.pip/pip.conf 输入内容: [global]index-url = http://pypi.douban.com/simple/[install]trusted ...
- Spring Cloud(8):日志及分布式跟踪(Sleuth&Zipkin)
简介 在微服务架构中,项目中前端发起一个请求,后端可能跨几个服务调用才能完成这个请求.如果系统越来越庞大,服务之间的调用与被调用关系就会变得很复杂,那么这时候我们需要分析具体哪一个服务出问题了就会显得 ...
- 利用windows任务计划备份sqlserver
sqlserver Express版不含agent service(虽然可以从“服务”里看到,但是无法启动),因此无法使用代理服务执行备份作业,如果代理作业服务正常,建议还是首先采用代理服务. 此备份 ...
- iOS-UIAlertView与UIActionSheet
UIAlertView与UIActionSheet 6.11.1 常规调用 UIAlertView:调出一个模态对话框,屏幕居中显示 UIActionSheet:非模态对话框,屏幕下方弹出 Alert ...
- JWT(JSON Web Tokens)操作帮助类
载荷实体: /// <summary> /// JWT载荷实体 /// </summary> public sealed class JWTPlayloadInfo { /// ...
- idea查看一个接口的子接口或实现类的快捷键
ctrl+h 先选中类或接口,再按ctrl+h
- clog就用clog的后缀名
/tmp/log/shuanggou.clog /tmp/log/shuanggou.log /tmp/log/shuanggou_success.log /tmp/log/shuanggou_err ...
- [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)
linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...