zoukankan      html  css  js  c++  java
  • [模板] 判负环

    之前判负环只会SPFA记录访问次数那种naive做法,交上去基本都是TLE的。

    原来单纯判负环是由更好的算法的。

    记不清在哪里看到过 ,单判负环优先队列比队列快(?!),试了一下,T到飞起。

    把BFS改成DFS,直觉上也能明晰地感觉到可以更快地“接近”负环。

    UPD:被特殊数据卡成傻子了

    //Stay foolish,stay hungry,stay young,stay simple
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cctype>
    #define R register
    using namespace std;
    
    const int MAXN=200000;
    
    bool flag=0;
    
    inline int read_d(){
        int ret=0;
        char c;
        while(c=getchar(),!isdigit(c));
        while(isdigit(c)){
            ret=ret*10+c-'0';
            c=getchar();
        }
        return ret;
    }
    
    int n,m;
    
    struct Edge{
        int next,to,w;
    }e[MAXN<<1];
    int ecnt,head[MAXN];
    inline void add(int x,int y,int w){
        e[++ecnt].next = head[x];
        e[ecnt].to = y;
        e[ecnt].w = w;
        head[x] = ecnt;
    }
    
    bool vis[MAXN];
    int dis[MAXN];
    void dfs(int now){
        vis[now]=1;
        for(int i=head[now];i;i=e[i].next){
            int v=e[i].to ;
            if(dis[v]>dis[now]+e[i].w){
                if(vis[v]||flag) {
                    flag=1;break;
                }
                dis[v]=dis[now]+e[i].w;
                dfs(v);
            }
        }
        vis[now]=0;
    }
    
    int main(){
        int t;
        t=read_d();
        while(t--){
            memset(head,0,sizeof(head));
            memset(vis,0,sizeof(vis));
            memset(dis,0,sizeof(dis));
            ecnt=0;flag=0;
            n=read_d();
            m=read_d();
            for(R int i=1;i<=m;i++){
                int x,y,w;
                x=read_d();
                y=read_d();
                scanf("%d",&w);
                add(x,y,w);
                if(w>=0) add(y,x,w);
            }
            for(int i=1;i<=n;i++){
                dfs(i);
            }
            if(flag)puts("YE5");
            else puts("N0");
        }
        return 0;
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247442.html

  • 相关阅读:
    yum插件yum-fastestmirror
    mysql利用yum安装指定数据存放路径
    快速搭建Seeddms文档管理系统
    Oracle单实例启动多个实例
    HTTP 304状态分析
    Oracle快速克隆安装
    Linux安装SQLite轻量级数据库
    redhat利用yum快速搭建LAMP环境
    将博客搬至CSDN
    GenericServlet 、Servlet和httpServler他们之间的关系
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247442.html
Copyright © 2011-2022 走看看