• poj1201Intervals(差分约束)


    http://poj.org/problem?id=1201

    设si[i+1]表示有不超过i的Z集合里面的数的个数,可以列出不等式si[b+1]-si[a]>=ci

    另有隐含条件 si[i+1]-s[i]>=0 si[i]-s[i+1]>=-1 利用spfa求出最长路

    View Code
     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<stdlib.h>
     5 #include<queue>
     6 using namespace std;
     7 #define IN 50010
     8 #define INF 0x3f3f3f
     9 struct node
    10 {
    11     int u,v,w,next;
    12 }men[IN*4];
    13 int t,first[IN],n,dis[IN],vis[IN];
    14 void init()
    15 {
    16     t = 0;
    17     memset(first,-1,sizeof(first));
    18 }
    19 void add(int u,int v,int w)
    20 {
    21     men[t].u = u;
    22     men[t].v = v;
    23     men[t].w = w;
    24     men[t].next = first[u];
    25     first[u] = t;
    26     t++;
    27 }
    28 void spfa(int st)
    29 {
    30     int i;
    31     for(i = 0; i <= n ; i++)
    32         dis[i] = -INF;
    33     queue<int>q;
    34     q.push(st);
    35     memset(vis,0,sizeof(vis));
    36     vis[st] = 1;
    37     dis[st] = 0;
    38     while(!q.empty())
    39     {
    40         int u = q.front();
    41         vis[u] = 0;
    42         q.pop();
    43         for(i = first[u];i!=-1 ; i = men[i].next)
    44         {
    45             int v = men[i].v;
    46             int w = men[i].w;
    47             if(dis[v]<dis[u]+w)
    48             {
    49                 dis[v] = dis[u]+w;
    50                 if(!vis[v])
    51                 {
    52                     vis[v] = 1;
    53                     q.push(v);
    54                 }
    55             }
    56         }
    57     }
    58 }
    59 int main()
    60 {
    61     int i,a,b,c,ma=-1,mi = IN;
    62     while(cin>>n)
    63     {
    64         init();
    65         for(i = 1; i <= n ; i++)
    66         {
    67             cin>>a>>b>>c;
    68             add(a,b+1,c);
    69             if(b+1>ma)
    70             ma = b+1;
    71             if(a<mi)
    72             mi = a;
    73         }
    74         for(i = mi ; i <= ma ; i++)
    75         {
    76             add(i,i+1,0);
    77             add(i+1,i,-1);
    78         }
    79         spfa(mi);
    80         cout<<dis[ma]<<endl;
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    ios学习Day3xiawu
    ios学习Day3
    linux系统设置回收站
    Linux sort命令的注意点
    markdown文件管理
    PG创建只读用户
    PG游标引用实例
    小狼毫输入法配置双拼输入
    日期相关
    PG数组使用
  • 原文地址:https://www.cnblogs.com/shangyu/p/2955456.html
Copyright © 2020-2023  润新知