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;
    }                  
     
    
    



  • 相关阅读:
    Maven关于web.xml中Servlet和Servlet映射的问题
    intellij idea的Maven项目运行报程序包找不到的错误
    修改Maven项目默认JDK版本
    刷题15. 3Sum
    刷题11. Container With Most Water
    刷题10. Regular Expression Matching
    刷题5. Longest Palindromic Substring
    刷题4. Median of Two Sorted Arrays
    刷题3. Longest Substring Without Repeating Characters
    刷题2. Add Two Numbers
  • 原文地址:https://www.cnblogs.com/csnd/p/12063053.html
Copyright © 2011-2022 走看看