• P3385 【模板】负环


    题目描述

    给定一个 n 个点的有向图,请求出图中是否存在从顶点 1 出发能到达的负环。

    负环的定义是:一条边权之和为负数的回路。

    输入格式

    输入的第一行是一个整数 T,表示测试数据的组数。对于每组数据的格式如下:

    第一行有两个整数,分别表示图的点数 n 和接下来给出边信息的条数 m。

    接下来 m 行,每行三个整数 u, v, w。

    • 若 w≥0,则表示存在一条从 u 至 v 边权为 w 的边,还存在一条从 v 至 u 边权为 w 的边。
    • 若 w < 0,则只表示存在一条从 u 至 v 边权为 w 的边。

    输出格式

    对于每组数据,输出一行一个字符串,若所求负环存在,则输出 YES,否则输出 NO

    输入输出样例

    输入

    2
    3 4
    1 2 2
    1 3 4
    2 3 1
    3 1 -3
    3 3
    1 2 3
    2 3 4
    3 1 -8
    

    输出

    NO
    YES

    怎么判断负环呢

    使用spfa跑一遍最短路,然后用一个数组cnt记录每个点的入队次数,入队次数大于了n,就是有负环,跑了一遍没找到,就没有

    1. #include
    2. using namespace std;
    3. const int N=1e5+5;
    4. struct node{
    5. int to,dis;
    6. };
    7. int T;
    8. vectora[N];
    9. int dis[N];
    10. int vis[N];
    11. int cnt[N];
    12. int n,m;
    13. queue<int>q;
    14. bool spfa(){
    15. for(int i=1;i<=n;i++)dis[i]=2147483647;
    16. dis[1]=0;
    17. q.push(1);
    18. vis[1]=1;
    19. while(!q.empty()){
    20. int x=q.front();
    21. q.pop();
    22. vis[x]=0;
    23. for(int i=0;isize();i++){
    24. int v=a[x][i].to;
    25. int w=a[x][i].dis;
    26. if(dis[v]>dis[x]+w){
    27. dis[v]=dis[x]+w;
    28. if(vis[v]==0){
    29. vis[v]=1;
    30. q.push(v);
    31. cnt[v]++;
    32. }
    33. if(cnt[v]>n)return true;
    34. }
    35. }
    36. }
    37. return false;
    38. }
    39. signed main(){
    40. scanf("%d",&T);
    41. while(T--){
    42. scanf("%d%d",&n,&m);
    43. memset(vis,0,sizeof(vis));
    44. memset(cnt,0,sizeof(vis));
    45. while(!q.empty())q.pop();
    46. for(int i=1;i<=n;i++)a[i].clear();
    47. for(int i=1;i<=m;i++){
    48. int u,v,w;
    49. scanf("%d%d%d",&u,&v,&w);
    50. a[u].push_back(node{v,w});
    51. if(w>=0)a[v].push_back(node{u,w});
    52. }
    53. if(spfa())printf("YES\n");
    54. else printf("NO\n");
    55. }
    56. }

  • 相关阅读:
    小脚本杂文shell脚本
    vue3兄弟组件通信之第三方库/插件-mitt工具
    电视剧里的代码真能运行吗?
    二、let 和 const 命令
    VSCode远程连接
    MyBatis与Spring框架整合实现对数据库的增删改查
    新版软考高项试题分析精选(二)
    (六) ES6 新特性 —— 迭代器(iterator)
    jmeter-beanshell学习1-vars使用获取变量和设置变量
    ClickHouse引擎之-MaterializeMYSQL
  • 原文地址:https://blog.csdn.net/STY_fish_2012/article/details/138028553