zoukankan      html  css  js  c++  java
  • HDU 3259 Wormholes

    题意:就是给你一个n,m,t   n代表有多少个点。m代表有多少个双向的边  t代表的是虫洞。如今要你判读是否还能够穿越到过去的点

    虫洞的意思是给你的边是单向的,而且是负权值(输入的时候是正数)




    思路:能否够穿越回过去的点,即有没有负环。果断套用模板,dijkstra算法不能检測负环

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define maxn 520
    const int INF = 0x3fffffff;
    struct Edge
    {
        int from,to,dist;
    };
    struct BellmanFord
    {
        int n,m;
        vector<Edge> edges;
        vector<int> G[maxn];
        bool inq[maxn];
        int d[maxn];
        int p[maxn];
        int cnt[maxn];
        Edge e;
        void init(int n)
        {
            this->n=n;
            for(int i=0;i<n;i++)
                G[i].clear();
            edges.clear();
        }
        void AddEdge(int from,int to,int dist)
        {
            edges.push_back((Edge){from,to,dist});
            m=edges.size();
            G[from].push_back(m-1);
        }
        bool negativeCycle()
        {
            queue<int >Q;
            memset(inq,0,sizeof(inq));
            memset(cnt,0,sizeof(cnt));
            for(int i=0;i<n;i++)
            {
                d[i]=INF;
                inq[0]=true;
                Q.push(i);
            }
            d[0] = 0;
            while(!Q.empty())
            {
                int u=Q.front();
                Q.pop();
                inq[u]=false;
    
                for(int i=0;i<G[u].size();i++)
                {
                    Edge& e=edges[G[u][i]];
                    if(d[e.to]>d[u]+e.dist)
                    {
                        d[e.to]=d[u]+e.dist;
                        p[e.to]=G[u][i];
                        if(!inq[e.to])
                        {
                            Q.push(e.to);
                            inq[e.to]=true;
                            if(++cnt[e.to]>n)
                                return true;
                        }
                    }
                }
    
            }
            return false;
        }
    };
    int main()
    {
         int a,b,c,i,node,m,t,case1,k;
         bool j;
         scanf("%d",&case1);
         while(case1--)
         {
                scanf("%d %d %d",&node,&m,&t);
                if(node==0&&m==0)break;
                BellmanFord tu;
                tu.init(node);
                for(i=0;i<m;i++)
                {
                    scanf("%d %d %d",&a,&b,&c);
                    a--;b--;
                    tu.AddEdge(a,b,c);
                    tu.AddEdge(b,a,c);
                }
                for(k=0;k<t;k++)
                {
                    scanf("%d %d %d",&a,&b,&c);
                    a--;
                    b--;
                    tu.AddEdge(a,b,-c);
                }
                j=tu.negativeCycle();
                if(j)
                    printf("YES
    ");
                else
                    printf("NO
    ");
         }
         return 0;
    }
    


  • 相关阅读:
    RTF文件格式
    javascript 正则表达式基础
    不同线程之间传递数据
    JavaScript trim函数
    Simple Editor
    关于RichTextBox字体的问题
    手机短信自动清理方式
    手机来电显示新方法
    具有二维码自动识别功能的交通标志
    利用手机扫描二维码技术识别房屋租赁信息
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5341699.html
Copyright © 2011-2022 走看看