日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 1716 区间最小点个数

發布時間:2025/6/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 区间最小点个数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。