码迷,mamicode.com
首页 > 其他好文 > 详细

P3385 【模板】负环

时间:2018-04-03 17:18:46      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:bool   pac   user   bre   dfs   pre   ios   use   iostream   

P3385 【模板】负环


bfs—spfa太慢,对于判负环

就只能用dfs—spfa

判负环的依据,具体会体现在code中

还有一道题也是判环

思路也是类似

我的思路

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node
{
    int point;
    int nxt;
    int weight;
};
int head[500000],tail;
node line[500000];
int dis[500000];
int vis[500000];
bool flag;
void add(int a,int b,int c)
{
    line[++tail].point=b;
    line[tail].nxt=head[a];
    line[tail].weight=c;
    head[a]=tail;
}
void spfa(int x)
{
    vis[x]=true;
    for(int i=head[x];i;i=line[i].nxt)
    {
        if(dis[line[i].point]>dis[x]+line[i].weight)
        {
            if(vis[line[i].point]||flag)
            {
                flag=true;
                return ;
            }
            dis[line[i].point]=dis[x]+line[i].weight;
            spfa(line[i].point);
        }
    }
    vis[x]=false;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int l=1;l<=t;l++)
    {
        int n,m;
        memset(vis,0,sizeof(vis));
        memset(dis,0,sizeof(dis));//全置为0,这样正数边权就会被dfs时剪掉。只留下负数边权
        memset(head,0,sizeof(head));
        tail=0;
        flag=false;
        scanf("%d%d",&n,&m);
        int a,b,c;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(c>=0)
            {
                add(a,b,c);
                add(b,a,c);
            }
            else
                add(a,b,c);
        }
        for(int i=1;i<=n;i++)
        {
            spfa(i);//每个点一个跑一边
                        //不过为什么是正确的呢?
                        //如果和一个点与之相连的边都是正数,我们根本不能确定它是不是在负权环上
                        //但是如果一条边是负数,它有很大可能在负权边上。大体理会下[]~( ̄▽ ̄)~*
            if(flag)
                break;
        }
        if(flag)
            printf("YE5\n");
        else
            printf("N0\n"); 
    }
}
/*
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

*/

P3385 【模板】负环

标签:bool   pac   user   bre   dfs   pre   ios   use   iostream   

原文地址:https://www.cnblogs.com/Lance1ot/p/8708727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!