• HDU3592 World Exhibition 排队判断3种情况


    /*
    *State:  HDU3592 31MS 448K 2009 B C++ 
    *题目大意:
    *        有N个人按照1-N 的顺序排成一排,给你X个关于他们位置的关系,
    *        如:a, b ,c,则说明编号为a的人在标号为b 的人的前面,且两人
    *        最多相隔c距离,再给你Y给位置关系,给出的是a和b两个人至少相
    *        距c,问1号人和N号人最远相距多少。如果不存在这样的排序,则输
    *        出-1 ,如果1和N可以相距任意的距离,则输出-2, 否则输出最长
    *        的距离。
    *解题思路:
    *        由于求的是最大的距离,所以要用约束条件的最短路来求。题目已经
    *        给了两种约束条件了,但是这样做还是会wa,因为少了Sv - Su >= 0
    *        这个约束条件。所以一共有三种约束条件。最后注意当图是不连通的时
    *        候就是-2的情况。所以就不用并查集来判断一遍啦。
    *解题感想:
    *        注意寻找完整全部的约束条件,还有要用最短路,还是最长路。
    */
    View Code
    #include <iostream>
    #include <map>
    #include <string>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int MAXN = 1005;
    const int MAXE = 1000005;
    const __int64 inf = 1000000000000ll;
    
    typedef struct _uq
    {
        int p;
    }UQ;
    
    UQ uqSet[MAXN];
    typedef struct _node
    {
        int u, v, w;
        int next;
    }N;
    N edge[2 * MAXE];
    int head[MAXN], cntEdge;
    
    void init()
    {
        cntEdge = 0;
        for(int i = 0; i < MAXN; i++)
        {    
            head[i] = -1;
            uqSet[i].p = i;
        }
    }
    
    void addEdge(int u, int v, int w)
    {
        edge[cntEdge].u = u;
        edge[cntEdge].v = v;
        edge[cntEdge].w = w;
        edge[cntEdge].next = head[u];
        head[u] = cntEdge++;
    }
    
    __int64 Bellman_ford(int s, int n)
    {
        __int64 dis[MAXN];
        for(int i = 0; i <= n; i++)
            dis[i] = inf;
    
        dis[s] = 0;
        for(int i = 0; i < n-1; i++)
        {
            bool flag = false;
            for(int j = 0; j < cntEdge; j++)
            {
                int u = edge[j].u;
                int v = edge[j].v;
                __int64 w = edge[j].w;
                if(dis[v] > dis[u] + w)
                {
                    dis[v] = dis[u] + w;
                    flag = true;
                }
            }
            if(!flag)
                break;
        }
        /*cout << "-----------------" << endl;
        for(int i = 0; i <= n; i++)
            cout << dis[i] << " ";
        cout << "-----------------" << endl;*/
        for(int f = 0; f < cntEdge; f++)
        {
            int u = edge[f].u, v = edge[f].v;
            __int64 w = edge[f].w;
            if(dis[v] > dis[u] + w)
                return -1;
        }
        return dis[n];
    }
    
    int main(void)
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
    #endif
    
        int n, cas;
        scanf("%d", &cas);
        while(cas--)
        {
            init();
            int x, y, u, v, w;
            scanf("%d %d %d", &n, &x, &y);
            for(int i = 0; i < x; i++)
            {
                scanf("%d %d %d", &u, &v, &w);
                addEdge(u, v, w);
            }
            for(int i = 0; i < y; i++)
            {
                scanf("%d %d %d", &u, &v, &w);
                addEdge(v, u, -w);
            }
            for(int i = 1; i <= n; i++)
            {
                addEdge(i, i - 1, 0);
            }
            
            __int64 sol = Bellman_ford(1, n);
            if(sol == -1)
                printf("-1\n");
            else if(sol == inf)
                printf("-2\n");
            else
                printf("%I64d\n", sol);
        }
        return 0;
    }
  • 相关阅读:
    阻止JavaScript事件冒泡传递<转>
    小温谈数据库优化数据库设计篇
    名言集合
    SQL Server中获得EXEC的值<转>
    WIN2008 64位系统配置PHP的方法
    陪伴我作为程序员的9句名言<转>
    C# 的快捷键汇总(一)
    使用VB.NET开发复合控件
    C#写SQL SERVER2008存储过程
    c#图像处理入门
  • 原文地址:https://www.cnblogs.com/cchun/p/2667579.html
Copyright © 2020-2023  润新知