zoukankan      html  css  js  c++  java
  • 【模板】负环

    【模板】负环

    题目描述

    暴力枚举/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

    做法:dfs_spfa

    我今天这题一直TLE,觉得真是鬼来了。于是乎我勤(sang)劳(bing)的交了。。。

    后面发现边要开到>>4,MDZZ;

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define maxn 200010
    #define inf 1e9+7
    using namespace std;
    struct node{int to,next,c;}e[maxn<<4];
    int head[maxn],dis[maxn],cnt,n,m;
    bool vis[maxn],flag;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void add(int a,int b,int w)
    {
        e[++cnt]=(node){b,head[a],w};head[a]=cnt;
    }
    void inti()
    {
        int a,b,w;n=read();m=read();
        while(m--)
        {
            a=read();b=read();w=read();
            add(a,b,w);if(w>=0) add(b,a,w); 
        }
    }
    void spfa(int u)
    {
        if(flag) return;vis[u]=1;int v;     
        for(int i=head[u];i;i=e[i].next)
        {
            if(flag) return;v=e[i].to;
            if(dis[u]+e[i].c<dis[v])
            {
                if(vis[v]) {flag=1;break;}
                dis[v]=dis[u]+e[i].c; spfa(v);    
              }    
        }  vis[u]=0;
    }
    int main()
    {
        int t=read();
        while(t--)
        {
            memset(head,0,sizeof(head));
            memset(dis,inf,sizeof(dis));
            memset(vis,0,sizeof(vis));
            cnt=0;flag=false;dis[1]=0;inti();
            for(int i=1;i<=n;i++){spfa(i);if(flag) break;}
            if(flag)printf("YE5
    ");
            else  printf("N0
    ");
        }
        return 0;
    }
    负环

     以上By hahacarrot(LQ_double) 2016/11/14

  • 相关阅读:
    Java遍历包中所有类方法注解
    mysql字符集问题
    mybatis查询mysql的datetime类型数据时间差了14小时(时区问题)
    mysql 查询的一次bug
    redis分布式锁超时事故
    maven 多个镜像
    maven deploy
    DFS( 修改)
    poj.org --map-- 1002
    nyist 58 最少步数
  • 原文地址:https://www.cnblogs.com/LQ-double/p/6062326.html
Copyright © 2011-2022 走看看