zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Python 爬虫js加密破解(一) 爬取今日头条as cp 算法 解密
    Python 爬虫实例(2)—— 爬取今日头条
    Python 爬虫实例(1)—— 爬取百度图片
    python 操作redis之——HyperLogLog (八)
    python 操作redis之——有序集合(sorted set) (七)
    Python操作redis系列之 列表(list) (五)
    Python操作redis系列以 哈希(Hash)命令详解(四)
    Python操作redis字符串(String)详解 (三)
    How to Install MySQL on CentOS 7
    Linux SSH远程文件/目录 传输
  • 原文地址:https://www.cnblogs.com/cchun/p/2667579.html
Copyright © 2011-2022 走看看