POJ 1716 区间最小点个数
題意:
???? 給你n個區間,每個區間最少取兩個元素,問你所有區間最少取幾個元素(可以滿足每個區間最少兩個元素)。
?
思路:
???? 這個題目感覺挺巧妙的,之前在杭電上做過這個題目,這個題目可以用查分約束來做,對于每一個區間a,b我們可以這樣 b - a >= 2 那么建圖a->b 長度是2,全建完之后不要忘記題目的隱含條件,查分約束中隱含條件很重要,這個題目的隱含條件就是相鄰的兩個點之間的個數大于等于0,小于等于1,也就是? 0 =< i - (i - 1) <= 1,然后拆成兩部分,對于i - (i - 1) >= 0? 建立 (i - 1)-> i 長度0,對于i - (i - 1) <= 1先轉換成 (i - 1) - i >= -1 建立 i -> (i - 1) 長度是-1,然后以最小點為起點一邊最長路,在查分約束中要記住,求最小就跑最長路,求最大就跑最短路,其他的沒啥。
?
#include<stdio.h>
#include<string.h>
#include<queue>
#define N_node 11000
#define N_edge 33000
#define INF 1000000000
using namespace std;
typedef struct
{
?? int to ,next ,cost;
}STAR;
STAR E[N_edge];
int list[N_node] ,tot;
int mark[N_node] ,mki[N_node] ,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 ,mark[i] = mki[i] = 0;
?? queue<int>q;
?? q.push(s);
?? s_x[s] = 0 ,mark[s] = mki[s] = 1;
?? 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])
???????????? {
??????????????? mark[xin] = 1;
??????????????? if(++mki[xin] > n) return 0;
??????????????? q.push(xin);
???????????? }
?????????? }
?????? }
?? }
?? return 1;
}
int main ()
{
??? int i ,a ,b ,n ,Min ,Max;
??? while(~scanf("%d" ,&n))
??? {
?????? Min = INF ,Max = -INF;
?????? memset(list ,0 ,sizeof(list)) ,tot = 1;
?????? for(i = 1 ;i <= n ;i ++)
?????? {
????????? scanf("%d %d" ,&a ,&b);
????????? b++;
????????? if(Min > a) Min = a;
????????? if(Max < b) Max = b;
????????? add(a ,b ,2);
?????? }
?????? for(i = Min ;i <= Max ;i ++)
?????? add(i - 1 ,i ,0) ,add(i ,i - 1 ,-1);
?????? spfa(Min ,Max);
?????? printf("%d\n" ,s_x[Max]);
??? }
??? return 0;
}
??????
??????
??
總結
以上是生活随笔為你收集整理的POJ 1716 区间最小点个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1679 判断最小树是否唯一
- 下一篇: Poj 3522 最长边与最短边差值最小