POJ1716-Integer Intervals(区间约束)

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
powell方法是计算最值的有效方法,一般情况下是无约束的,目前Powell已发展了一种称为BOBYQA的带区间约束算法。 压缩文件里面optimization.h是无约束powell寻优的一个类,以前在baidu上找到的。powell.h和powell.cpp是带区间约束的powell算法BOBYQA的C++包装,由于BOBYQA算法只能计算二维以上,一维算法是俺自己写的。调用时,一维算法采用ExecuteBrent,二维以上采用BoundedPowell。 BOBYQA目录下是powell方法祖师爷M. J. D. Powell写的FORTRAN代码,powell.lib是俺把Fortran代码编译成的静态库。由于这个lib是Fortran Power Station 4.0做的,msfrt40.dll就成了一个甩不掉的累赘。 如果使用Fortran编程的话,就不需要俺的包装了,直接用Fortran代码吧。 使用方法请参考Fortran代码中main.f,有问题请联系[email protected]。 另外链接时好像还需要fps4.0中的msfrt.lib,原来没有加进去,现在加不进去了。需要的话请邮件联系。 鉴于很多同志不清楚用法,下面略加说明。 BoundedPowell函数的参数说明。 第一个参数,待优化函数的指针,这个函数必须定义成_stdcall类型,其本身带有三个参数,第一个参数是优化变量个数,第二个参数是优化变量数组,第三个参数就是函数的值,由于使用Fortran的关系,这几个参数都必须传递地址。 举例说,假定待优化函数为f(x)=x^2,那么只有一个参数,这个函数应该定义为 void _stdcall objfun(int *n, double *para, double *f) { *f=para[0]*para[0]; } 第二个参数int n,待优化计算变量的个数 第三个参数double *x, 待优化变量,这是一个数组,长度为n 第四个参数double *xlb,变量的下界,数组 第五个参数double *xub,变量的上界,数组 第五个参数double rhobeg,第六个参数double rhoend,这两个参数是Powell同志定义的两个半径,具体我也说不清楚,你想搞清楚的话可以搜Powerll同志的文献。一般你把rhobeg设置为1,rhoend设置为计算的精度,比如你希望精度为万分之一,rhoend就为1e-4。 第七个参数int maxfun,最大迭代次数 第八个参数,BOBYQA计算时的返回代码,具体如下 // //BOBYQA iflag返回值的含义: //IFLAG=1, Return from BOBYQA because NPT is not in the required interval //IFLAG=2, Return from BOBYQA because one of the differences XU(I)-XL(I)/6X is less than 2*RHOBEG. //IFLAG=3, Return from BOBYQA because FCN has been called MAXFUN times. //IFLAG=4, Return from BOBYQA because of much cancellation in a denominator. //IFLAG=5, Return from BOBYQA because a trust region step has failed to reduce Q. //

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值