很蛋疼,用vector写了一遍只AC两个用例,其他WA,为啥呢?想不通啊。。。不应该啊

改成邻接表写,瞬间AC。。。

两者最多是个遍历顺序不同,存取效率不同,不至于WA啊,TLE还说的过去,有懂的指点一下啊

邻接表写:

#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=2e5+10;
const int INF=0x3f3f3f3f;
struct Edge{int to;int cost;int next;
}E[MAXN<<1];
bool flag=0;
bool vis[MAXN];
int head[MAXN];
int dist[MAXN];
int tol;
bool SPFA(int u){vis[u]=1;for(int i=head[u];i;i=E[i].next){  int v=E[i].to;if(dist[v]>dist[u]+E[i].cost){dist[v]=dist[u]+E[i].cost;if(vis[v] || flag){ flag=1;break;}//if(flag) return false;提前剪枝 否则TLESPFA(v);   }}vis[u]=0;return true;
}
void addedge(int u,int v,int w){tol++;E[tol].to=v;E[tol].cost=w;E[tol].next=head[u];head[u]=tol;}
int main(){int F;int n,m;cin>>F;while(F--){tol=0;flag=0;memset(head,0,sizeof(head));memset(dist,0,sizeof(dist));memset(vis,0,sizeof(vis));cin>>n>>m;for(int i=1;i<=m;i++){int x,y,l;cin>>x>>y>>l;if(l>=0){addedge(x,y,l);addedge(y,x,l);}else{addedge(x,y,l);}}for(int i=1;i<=n;i++){ SPFA(i);if(flag)break;}if(flag)printf("YE5\n");else printf("N0\n");}return 0;
}

vector写:

#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=2e5+10;
const int INF=0x3f3f3f3f;
struct Edge{int v;int cost;Edge(int _v=0,int _cost=0):v(_v),cost(_cost){};
};
vector<Edge> E[MAXN*2];
bool flag=0;
bool vis[MAXN];
int dist[MAXN];
bool SPFA(int u){if(vis[u]){flag=1;return false;}vis[u]=1;for(int i=E[u].size()-1;i>=0;i--){int v=E[u][i].v;if(dist[v]>dist[u]+E[u][i].cost){dist[v]=dist[u]+E[u][i].cost;if(flag) return false;SPFA(v);}}vis[u]=0;return true;
};
void addedge(int u,int v,int w){E[u].push_back(Edge(v,w));};
int main(){int F;int n,m;cin>>F;while(F--){flag=0;memset(dist,0,sizeof(dist));memset(vis,0,sizeof(vis));cin>>n>>m;for(int i=1;i<=m;i++){int x,y,l;cin>>x>>y>>l;if(l>=0){addedge(x,y,l);addedge(y,x,l);}else{addedge(x,y,l);}}for(int i=1;i<=n;i++){ SPFA(i);if(flag)break;}if(flag)printf("YE5\n");else printf("N0\n");}return 0;
}

SPFA-DFS P3385 模板 判断负环===vector为啥过不了?相关推荐

  1. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  2. Luogu P3385 【模板】负环 - 题解

    [模板]负环 题目描述 给定一个 nnn 个点的有向图,请求出图中是否存在从顶点 111 出发能到达的负环. 负环的定义是:一条边权之和为负数的回路. 输入格式 本题单测试点有多组测试数据. 输入的第 ...

  3. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  4. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  5. UVA 558 SPFA 判断负环

    这个承认自己没看懂题目,一开始以为题意是形成环路之后走一圈不会产生负值就输出,原来就是判断负环,用SPFA很好用,运用队列,在判断负环的时候,用一个数组专门保存某个点的访问次数,超过了N次即可断定有负 ...

  6. spfa判断负环( 负环判定 + spfa )

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible. 数据保证 ...

  7. 负环——spfa判断负环的两种方式

    第一种:(不推荐) 统计每个点的入队次数,如果某一个点入队了n次,则说明存在负环. 第二种: 统计当前每个点的最短路的边数,如果存在负环,负环上的某一个点的最短路边数一定会是正无穷,只要边数超过n(节 ...

  8. LightOJ - 1074 Extended Traffic(最短路+判断负环)

    题目链接:点击查看 题目大意:给出n个城市,每个城市都有一个拥挤度,从a到b的时间是(b的拥挤度-a的拥挤度)^3,点1为起点,求最短时间 题目分析:这个题第一感觉是个裸题,n还非常小,偷了个懒上了一 ...

  9. POJ3259(Wormholes) 判断负环

    题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞 ...

最新文章

  1. linux存储--inode详解(六)
  2. 如何提高表达能力——举手法则
  3. hibernate 多对多(many-to-many)
  4. POJ - 3190 Stall Reservations(贪心+优先队列优化)
  5. mybatis学习(46):二级缓存被刷新的情况
  6. 关于Tomcat 的一些配置和启动
  7. Atitit.如何建立研发体系
  8. Keras AlexNet 网络实现 Kaggle 猫狗大战
  9. mysql个人记账系统_个人记账系统
  10. 2021.2冬入京都大学修士考试复习经验贴
  11. App和小程序开发成本对比
  12. 糖醋鲤鱼——经典美食
  13. 狄拉克函数- dirac 分布
  14. JM模型I帧帧内预测流程
  15. 创建带头结点单链表实现二进制数加1的运算
  16. Windows 清理磁盘
  17. Mac安装完Mysql命令不可用解决方案
  18. 项目管理相关认证简要介绍(1)- 体系
  19. 最新 UltraEdit 24.20 注册成功经验分享
  20. 至2017年2月止SharePoint 2016 所有增加和更新内容。

热门文章

  1. spring boot学习资料以及DEMO项目
  2. PHP:第一章——PHP中的魔术常量
  3. VirtualBox虚拟机中启用usb3.0却无法显示u盘的解决方法
  4. Delphi 中的颜色常量及效果图
  5. 自定义input type=file 样式的方法
  6. 【OpenGL】关于OpenGL中Bind函数的理解
  7. 高效模式编写者的7个习惯
  8. 为何python攀上数据科学巅峰?调查显示Python超越R
  9. 发条js调试工具_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...
  10. 某天没有数据能查出来0数量_用Excel对纽约市出租车费数据探索性分析