zoukankan      html  css  js  c++  java
  • Uva 558 Wormholes

    这道题是要判断图中是否存在负环。。。用BF算法。。从0开始松弛

    存在负环,说明经过n-1次的松弛之后,还可以继续松弛。

    BF算法

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm> 
    using namespace std;
    #define inf 99999999
    const int maxn=2*2000; 
    int u[maxn],v[maxn],w[maxn];
    int d[maxn];
    int n,m;
    int BF(int p)
    {
         for(int i=0;i<n;i++)
         d[i]=inf;
         d[p]=0;
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                int x=u[j],y=v[j];
                if(d[x]+w[j]<d[y])
                d[y]=d[x]+w[j];
            }
        } 
        for(int i=0;i<m;i++)
        {
            int x=u[i],y=v[i]; 
            if(d[x]+w[i]<d[y])
            return 1;
        }
        return 0;
    } 
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d %d",&n,&m);
            for(int i=0;i<m;i++)
            scanf("%d %d %d",&u[i],&v[i],&w[i]);
        if(BF(0))
        {
            printf("possible
    ");
        }
        else
        printf("not possible
    ");
    }
    return 0;
    }

    dfs算法

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    const int maxn=2*2000;
    #define inf 999999999
    struct node
    {
       int u;
       int w;
       int next;
    }V[maxn];
    int tol;
    int d[maxn],f[maxn];
    int head[maxn];
    void init()
    {
        tol=0;
        memset(head,-1,sizeof(head));
    }
    void add(int u,int v,int w)
    {
        V[tol].u=v;
        V[tol].w=w;
        V[tol].next=head[u];
        head[u]=tol++;
    }
    int dfs_(int u)
    {
        f[u]=1;
        for(int i=head[u];i!=-1;i=V[i].next)
        {
            int v=V[i].u;
            int w=V[i].w;
            if(d[u]+w<d[v])
            {
            d[v]=d[u]+w;
            if(!f[v])
            {
            if(dfs_(v))
            return 1;
            }
            else
              return 1;
            }
        }
        f[u]=0;
        return 0;
    }
    int main()
    {
        int t,n,m;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d %d",&n,&m);
            for(int i=0;i<=n;i++)
            d[i]=inf;
            init();
            memset(f,0,sizeof(f));
            int a,b,c;
            while(m--)
            {
                scanf("%d %d %d",&a,&b,&c);
                add(a,b,c);
            }
            d[0]=0;
            if(dfs_(0))
            {
                printf("possible
    ");
            }
            else
            printf("not possible
    ");
        }
        return 0;
    } 
  • 相关阅读:
    Sunnypig闯三角关
    送给圣诞夜的贺卡
    uva 1592(NEERC 2009 STL)
    uva 297(传递闭包 WF 1996)
    hdu 4190(二分)
    uva 3592 (MST, kruskal)
    uva 11997 (基础数据结构)
    hdu 2680 (Dijkstra)
    hdu 4568(状态压缩dp)
    hdu 4582 (树上的贪心)
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580147.html
Copyright © 2011-2022 走看看