• hdu3169


                                                                                                           Layout
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 5492   Accepted: 2624

    Description

    Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a straight line waiting for feed. The cows are standing in the same order as they are numbered, and since they can be rather pushy, it is possible that two or more cows can line up at exactly the same location (that is, if we think of each cow as being located at some coordinate on a number line, then it is possible for two or more cows to share the same coordinate). 

    Some cows like each other and want to be within a certain distance of each other in line. Some really dislike each other and want to be separated by at least a certain distance. A list of ML (1 <= ML <= 10,000) constraints describes which cows like each other and the maximum distance by which they may be separated; a subsequent list of MD constraints (1 <= MD <= 10,000) tells which cows dislike each other and the minimum distance by which they must be separated. 

    Your job is to compute, if possible, the maximum possible distance between cow 1 and cow N that satisfies the distance constraints.

    Input

    Line 1: Three space-separated integers: N, ML, and MD. 

    Lines 2..ML+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at most D (1 <= D <= 1,000,000) apart. 

    Lines ML+2..ML+MD+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at least D (1 <= D <= 1,000,000) apart.

    Output

    Line 1: A single integer. If no line-up is possible, output -1. If cows 1 and N can be arbitrarily far apart, output -2. Otherwise output the greatest possible distance between cows 1 and N.

    Sample Input

    4 2 1
    1 3 10
    2 4 20
    2 3 3

    Sample Output

    27

    Hint

    Explanation of the sample: 

    There are 4 cows. Cows #1 and #3 must be no more than 10 units apart, cows #2 and #4 must be no more than 20 units apart, and cows #2 and #3 dislike each other and must be no fewer than 3 units apart. 

    The best layout, in terms of coordinates on a number line, is to put cow #1 at 0, cow #2 at 7, cow #3 at 10, and cow #4 at 27.
     
     
     
    #include<iostream>
    #include<queue>
    using namespace std;
    const int N = 1005;          //有N头牛
    const int INF = 0x3f3f3f3f;  //定义一个大数作为无穷大
    int NUM;                     //前向星变量,记录边数
    int head[N];                 //前向星表头
    bool flag[N];                //标记是否在队列
    int dis[N];                  //标记1到其他顶点的最短距离
    int sum[N];                  //标记入队次用,用于判断负环
    
    struct Node{                 //记录关系
        int v,w,next;            //目标点,权值,下一点索引
    }node[20005];
    
    
    void add(int a,int b,int c){ //前向星加边函数
        node[NUM].v = b;
        node[NUM].w = c;
        node[NUM].next = head[a];
        head[a] = NUM++;
    }
    
    int SPFA(int s,int n){
        int i;
        for(i=0;i<=n;i++){    
            sum[i] = 0;         //初始化所有点入队次数为0
            flag[i] = false;    //初始化队列标记,false为未入队
            dis[i] = INF;       //初始化1到其他顶点距离为无穷大
        }
        queue<int> q;           //定义一个队列,存放维护的点
        q.push(s);              //把源点放进队列
        dis[s]=0;               //到自身距离为0
        while(!q.empty()){      //若队列不为空
            int u = q.front();  //取队列头元素
            q.pop();            //取元素后,元素弹出
            flag[u] = false;    //标记为不在队列
            for(i=head[u];~i;i=node[i].next)
            { //遍历与U相连的所有点
                int v = node[i].v;            //终点 
                int w = node[i].w;            //起点到终点权值
                if(dis[v] > dis[u] + w)
                {      //
                    dis[v] = dis[u] + w;
                    if(!flag[v])
                    {             //若不再队列
                        q.push(v);            //把点放进队列维护 
                        flag[v] = true;       //标记为在队列
                        if(++sum[v] > n)
                        {     //入队数++,如果超过n,存在负环
                            return -1;  
                        }
                    }
                }
            }
    
        }
        if(dis[n] == INF) return -2;
        return dis[n];
    }
    
    int main(){
        int n,ml,md,a,b,c;
        while(scanf("%d%d%d",&n,&ml,&md)!=EOF){
            memset(head,255,sizeof(head));   //初始化表头
            NUM = 0;
            while(ml--){                     //喜欢
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);                  //b-a<=c
            }
            while(md--){                     //不喜欢
                scanf("%d%d%d",&a,&b,&c); 
                add(b,a,-c);                 //b-a>=c
            }
            printf("%d
    ",SPFA(1,n));
        }
        return 0;
    }
    
       
  • 相关阅读:
    结算凭证中委托付款部分sql
    各公司年资金归集汇总sql
    通过开户银行账号查询客商名称 sql
    TRIGGER_15.8.3BACKUP
    备份触发器:ADDC3
    sql查询单个银行账号重复
    待研究:insert客商账户触发器增加条件提示为空
    sql:劳务统计各分公司管理费用明细合计(等同汇总报表)
    【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
    【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/3235954.html
Copyright © 2020-2023  润新知