• POJ 1201 Intervals


    d[i]=区间[0,i)中所有的整点数。得到两个不等式:

    d[b+1]-d[a]<=c,0<=d[i+1]-d[i]<=1;

    根据这两个不等式来做差分约束。

    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #define maxn 50010
     6 #define maxm 150010
     7 using namespace std;
     8 
     9 int first[maxn],d[maxn],inq[maxn];
    10 int v[maxm],next[maxm],w[maxm];
    11 int e,n;
    12 
    13 void init()
    14 {
    15     e = 0;
    16     memset(first,-1,sizeof(first));
    17 }
    18 
    19 void add_edge(int a,int b,int c)
    20 {
    21     v[e] = b,next[e] = first[a],first[a] = e,w[e] = c,e++;
    22 }
    23 
    24 int spfa(int min1,int max1)
    25 {
    26     queue<int> q;
    27     int i,ith;
    28     for(i = min1;i <= max1;i++)
    29     {
    30         d[i] = -maxn;
    31         inq[i] = 0;
    32     }
    33     d[min1] = 0;
    34     q.push(min1);
    35     inq[min1] = 1;
    36     while(!q.empty())
    37     {
    38         ith = q.front();
    39         q.pop();
    40         inq[ith] = 0;
    41         for(i = first[ith];i != -1;i = next[i])
    42         {
    43             if(d[v[i]] < d[ith] + w[i])
    44             {
    45                 d[v[i]] = d[ith] + w[i];
    46                 if(!inq[v[i]])
    47                 {
    48                     q.push(v[i]);
    49                     inq[v[i]] = 1;
    50                 }
    51             }
    52         }
    53     }
    54     return d[max1];
    55 }
    56 int main()
    57 {
    58     while(scanf("%d",&n) == 1)
    59     {
    60         int max1 = -maxn,min1 = maxn;
    61         int i,a,b,c;
    62         init();
    63         for(i = 1;i <= n;i++)
    64         {
    65             scanf("%d%d%d",&a,&b,&c);
    66             add_edge(a,b + 1,c);
    67             max1 = b > max1 ? b : max1;
    68             min1 = a < min1 ? a : min1;
    69         }
    70         max1++;
    71         for(i = min1;i < max1;i++)
    72         {
    73             add_edge(i,i + 1,0);
    74             add_edge(i + 1,i,-1);
    75         }
    76         printf("%d\n",spfa(min1,max1));
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    Java -verbose:gc 命令
    JVM中启用逃逸分析
    nginx指定配制文件
    jvm笔记
    python添加tab键提示
    ssh-copy-id帮你建立信任
    救火必备linux命令
    oracle判断字符串中包函另外一个字符串
    String,StringBuffer,StringBuilder三者区别
    Python数据分析应用背景
  • 原文地址:https://www.cnblogs.com/zhexipinnong/p/2842245.html
Copyright © 2020-2023  润新知