POJ 1141 Brackets Sequence

#include
#include <queue>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int End,n;
struct node
{
    int value;
    long long time;
    friend bool operator<(const node &u,const node &v)
    {
        if(u.time==v.time)
            return u.value<v.value;
        return u.time>v.time;
    }
};
struct data
{
    int a,b,c;
    friend bool operator<(const data &u,const data &v)
    {
        return u.b<v.b;
    }
}num[100010];

bool mk[100010];
void DFS()
{
    memset(mk,0,sizeof(mk));
    node start;
    start.value=1;
    start.time=0;
    int st=0;
    priority_queue<node>q;
    q.push(start);
    while(!q.empty())
    {

        node now = q.top();
        q.pop();
        if(now.value>=End)
        {
            printf("%lld\n",now.time);
            return ;
        }
        int k;
        for( k=st;k<n&&now.value>=num[k].b;k++)
        {
            
            if(mk[k]||now.value==num[k].a)
                continue;
            mk[k]=true;
            node temp = now;
            temp.value=num[k].a;
            temp.time+=num[k].c;
            q.push(temp);
        }
        st=k;
    }
    printf("-1\n");

}
int main()
{
    int t,i;
    scanf("%d",&t);
    int cnt=1;
    while (t--)
    {
        
        scanf("%d%d",&n,&End);
        int Max=-1;
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&num[i].a,&num[i].b,&num[i].c);
            if(num[i].a>Max)
                Max=num[i].a;
        }
        if(Max<End)
        {
            printf("-1\n");
            continue;
        }
        sort(num,num+n);
        printf("Case #%d: ",cnt++);
        DFS();
    }
    return 0;
}             

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章