当前位置: 代码迷 >> 综合 >> POJ1716-Integer Intervals(区间约束)
  详细解决方案

POJ1716-Integer Intervals(区间约束)

热度:68   发布时间:2023-12-06 20:11:25.0

题目链接:http://poj.org/problem?id=1716

大致题意:

给出数轴上的n个区间,每个区间都是连续的int区间。

现在要在数轴上任意取一堆元素,构成一个元素集合V

要求每个区间和元素集合V的交集至少有两个不同的元素

求集合V最小的元素个数。


#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 30005;
const int N = 10005;
int dis[N], head[N], time[N], cnt;
bool vis[N];
struct Edge
{int fro, to, w, next;
}edge[maxn];
void add_edge(int u, int v, int w)
{edge[cnt].fro = u;edge[cnt].to = v;edge[cnt].w = w;edge[cnt].next = head[u];head[u] = cnt++;
}
int spfa(int s, int n)
{int kkk = 0;memset(dis, -1, sizeof(dis));memset(time, 0, sizeof(time));memset(vis, false , sizeof(vis));dis[s] = 0;vis[s] = true;time[s]++;queue<int> q;q.push(s);while(!q.empty()){int tem = q.front();vis[tem] = false;q.pop();for(int i = head[tem]; i != -1; i = edge[i].next){int to = edge[i].to;if(dis[to] < dis[tem] + edge[i].w){dis[to] = dis[tem] + edge[i].w;if(!vis[to]){vis[to] = true;q.push(to);time[to]++;}}}}return dis[n - 1];
}
int main()
{int n, u, v, w, ma;while(cin >> n){cnt = ma = 0;memset(head, -1, sizeof(head));for(int i = 1; i <= n; i++){scanf("%d%d", &u, &v);if(v + 1 > ma)ma = v + 1;add_edge(u, v+1, 2);}for(int i = 1; i <= ma; i++){add_edge(i-1, i, 0);add_edge(i, i - 1, -1);}int ans = spfa(0, ma+1);cout << ans << endl;}return 0;
}


  相关解决方案