• 洛谷—— P3385 【模板】负环


    https://www.luogu.org/problem/show?pid=3385#sub

    题目描述

    暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索

    输入输出格式

    输入格式:

    第一行一个正整数T表示数据组数,对于每组数据:

    第一行两个正整数N M,表示图有N个顶点,M条边

    接下来M行,每行三个整数a b w,表示a->b有一条权值为w的边(若w<0则为单向,否则双向)

    输出格式:

    共T行。对于每组数据,存在负环则输出一行"YE5"(不含引号),否则输出一行"N0"(不含引号)。

    输入输出样例

    输入样例#1:
    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
    
    输出样例#1:
    N0
    YE5
    

    说明

    N,M,|w|≤200 000;1≤a,b≤N;T≤10 建议复制输出格式中的字符串。

    此题普通Bellman-Ford或BFS-SPFA会TLE

    不能用百分数,就用电风扇~~~

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <queue> 
     5 
     6 using namespace std;
     7 
     8 const int N(200000+5);
     9 int t,n,m,u,v,w;
    10 int sumedge,head[N];
    11 struct Edge
    12 {
    13     int to,next,cost;
    14     Edge(int to=0,int next=0,int cost=0):
    15         to(to),next(next),cost(cost) {}
    16 }edge[N<<1];
    17 
    18 void ins(int from,int to,int cost)
    19 {
    20     /*++sumedge;
    21     edge[sumedge].to=to;
    22     edge[sumedge].next=head[from];
    23     edge[sumedge].cost=cost;*/
    24     edge[++sumedge]=Edge(to,head[from],cost);
    25     head[from]=sumedge;
    26 }
    27 
    28 int dis[N],vis[N],if_;
    29 
    30 void SPFA(int now)
    31 {
    32     vis[now]=1;
    33     for(int i=head[now];i;i=edge[i].next)
    34     {
    35         int go=edge[i].to;
    36         if(dis[go]>dis[now]+edge[i].cost)
    37         {
    38             if(vis[go]||if_)
    39             {
    40                 if_=1;
    41                 break;
    42             }
    43             dis[go]=dis[now]+edge[i].cost;
    44             SPFA(go);
    45         }
    46     }
    47     vis[now]=0;
    48 }
    49 
    50 void init()
    51 {
    52     memset(dis,0,sizeof(dis));
    53     memset(vis,0,sizeof(vis));
    54     memset(head,0,sizeof(head));
    55     if_=sumedge=0;
    56 }
    57 
    58 int main()
    59 {
    60     scanf("%d",&t);
    61     for(;t;t--)
    62     {
    63         scanf("%d%d",&n,&m);
    64         init();
    65         for(int i=1;i<=m;i++)
    66         {
    67             scanf("%d%d%d",&u,&v,&w);
    68             ins(u,v,w);
    69             if(w>=0) ins(v,u,w);
    70         }
    71         for(int i=1;i<=n;i++)
    72         {
    73             SPFA(i);
    74             if(if_) break;
    75         }
    76         if(if_) printf("YE5
    ");
    77         else printf("N0
    ");
    78     }    
    79     return 0;
    80 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    golang交叉编译:Linux
    vmware共享文件夹
    虚拟机-Debian服务器配置
    day38--MySQL基础二
    day19-IO多路复用
    mysql 对时间的处理
    mysql 优化
    Linux性能查看
    day18-socket 编程
    JAVA 消耗 CPU过高排查方法
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6882770.html
Copyright © 2020-2023  润新知