zoukankan      html  css  js  c++  java
  • POJ 3169 差分约束

    题意:
         有一群老牛,给你m1组关系a ,b ,c,说明a,b之间的距离大于小于等于c,m2组关系a ,b ,c说明a ,b之间的距离大于等于c,问你是否有可行解,如果没有输出-1 ,如果有输出1,n的最大距离,如果最大距离是INF输出-2;

    思路:

          显然是查分约束,这个题目的隐含条件就是任意两点的距离都大于等于0,把这个条件加进去,然后就是一遍最短路,一定要记住在查分约束系统中,最小的可行解就跑最长路,最大的可行解救跑最短路。


    #include<stdio.h>
    #include<string.h>
    #include<queue>
    
    #define N_node 1000 + 10
    #define N_edge 20000 + 200
    #define INF 100000000
    
    using namespace std;
    
    typedef struct
    {
       int to ,next ,cost;
    }STAR;
    
    STAR E[N_edge];
    int list[N_node] ,tot;
    int s_x[N_node];
    
    void add(int a ,int b ,int c)
    {
       E[++tot].to = b;
       E[tot].cost = c;
       E[tot].next = list[a];
       list[a] = tot;
    }
    
    bool spfa(int s ,int n)
    {
       for(int i = 0 ;i <= n ;i ++)
       s_x[i] = INF;
       int mark[N_node] = {0};
       int in[N_node] = {0};
       s_x[s] = 0;
       mark[s] = in[s] = 1;
       queue<int>q;
       q.push(s);
       while(!q.empty())
       {
           int xin ,tou;
           tou = q.front();
           q.pop();
           mark[tou] = 0;
           for(int k = list[tou] ;k ;k = E[k].next)
           {
               xin = E[k].to;
               if(s_x[xin] > s_x[tou] + E[k].cost)
               {
                   s_x[xin] = s_x[tou] + E[k].cost;
                   if(!mark[xin]) 
                   {
                       if(++in[xin] > n) return 0;
                       mark[xin] = 1;
                       q.push(xin);
                   }
               }
           }
       }   
       return 1;
    } 
    
    int main ()
    {
       int n ,m1 ,m2;
       int i ,a ,b ,c;
       while(~scanf("%d %d %d" ,&n ,&m1 ,&m2))
       {
           memset(list ,0 ,sizeof(list)) ,tot = 1;
           for(i = 1 ;i <= m1 ;i ++)
           {
              scanf("%d %d %d" ,&a ,&b ,&c);
              add(a,b ,c);
           }
           for(i = 1 ;i <= m2 ;i ++)
           {
               scanf("%d %d %d" ,&a ,&b ,&c);
               add(b ,a ,-c);
           }
           for(i = 1 ;i < n ;i ++)
           add(i + 1 ,i ,0);
           if(!spfa(1 ,n)) printf("-1
    ");
           else if(s_x[n] == INF) printf("-2
    ");
           else printf("%d
    " ,s_x[n]);
       }
       return 0;
    }                  
     
    
    



  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/csnd/p/12063053.html
Copyright © 2011-2022 走看看