Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这个猥琐的dp,我用暴长的spfa终于过了。回馈社会,给大家一组我发现bug的数据还有我的程序。

Posted by talenth1 at 2010-12-06 21:49:30 on Problem 1661
//自己调了2个晚自习,不容易呀。
1
8 50 99 50
0 100 88 
-50 20 77
40 100 77
-200 100 66
-300 100 50
150 300 50
-999 400 30
-1000 1000 25 
ans=1049
//一下是c++的code:
/*
ID:   talenth1
PROG: p1661
LANG: C++
*/
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define maxn 2000
#define oo 99999999
#define left(x) (2*x-1)
#define right(x) (2*x)
using namespace std;
struct Record{
    int x1,x2,h;
    };
struct Node{
    int v,w;
    Node* next;
    };
int t,n,x,y,lim,n1,d[maxn*2],que[maxn*2];
bool vis[maxn*2];
Record a[maxn];
Node *list[maxn*2];
void datain()
{
    scanf("%d%d%d%d",&n,&x,&y,&lim);
    for(int i=1;i<=n;i++)
        scanf("%d%d%d",&a[i].x1,&a[i].x2,&a[i].h);
}
int MyCmp(const void *x1,const void *x2)
{
    Record *xa,*xb;
    xa=(Record*)x1;
    xb=(Record*)x2;
    return(xb->h-xa->h);
}
void insert(int tp,int xp,int yp,int ta,int xa,int ya)
{
    Node *p;
    p=new(Node);
    p->v=ta;
    p->w=abs(yp-ya)+abs(xp-xa);
    p->next=list[tp];
    list[tp]=p;
}
bool relax(int u,int v,int w)
{
    if(d[u]+w<d[v]){
        d[v]=d[u]+w;
        return true;
        }
    else return false;
}
void spfa(int v0)
{
    int head=-1,tail=0;
    memset(vis,0,sizeof(vis));
    vis[v0]=true;
    for(int i=0;i<=n1;i++)
        d[i]=oo;
    d[v0]=0;
    que[0]=v0;
    while(head!=tail){
        head++;if(head>n1)head=0;
        int vi=que[head];
        Node* p=list[vi];
        while(p!=NULL){
            if(relax(vi,p->v,p->w))
                if(!vis[p->v]){
                    tail++;if(tail>n1)tail=0;
                    que[tail]=p->v;
                    vis[p->v]=true;
                    }
            p=p->next;
            }
        vis[vi]=false;
        }
}
void destory()
{
    Node *p,*np;
    for(int i=0;i<=n1;i++){
        p=list[i];
        while(p!=NULL){
            np=p->next;
            delete(p);
            p=np;
            }
        }
}
void work()
{
    n1=2*n+1;
    qsort(&a[1],n,sizeof(Record),MyCmp);
    for(int i=0;i<=n1;i++)
        list[i]=NULL;
    for(int i=1;i<=n;i++){
        bool sg1=true,sg2=true;
        for(int j=i+1;j<=n;j++){
            if(a[i].h-a[j].h>lim)break;
            if(a[i].x1>=a[j].x1&&a[i].x1<=a[j].x2&&sg1){
                insert(left(i),a[i].x1,a[i].h,left(j),a[j].x1,a[j].h);
                insert(left(i),a[i].x1,a[i].h,right(j),a[j].x2,a[j].h);
                if(a[i].h!=a[j].h)sg1=false;
                }
            if(a[i].x2>=a[j].x1&&a[i].x2<=a[j].x2&&sg2){
                insert(right(i),a[i].x2,a[i].h,left(j),a[j].x1,a[j].h);
                insert(right(i),a[i].x2,a[i].h,right(j),a[j].x2,a[j].h);
                if(a[i].h!=a[j].h)sg2=false;
                }
            if(!sg1&&!sg2)break;
            }
        if(sg1&&a[i].h<=lim)insert(left(i),a[i].x1,a[i].h,2*n+1,a[i].x1,0);
        if(sg2&&a[i].h<=lim)insert(right(i),a[i].x2,a[i].h,2*n+1,a[i].x2,0);  
        }
    bool sg=true;
    for(int i=1;i<=n;i++){
        if(y-a[i].h>lim)break;
        if(x>=a[i].x1&&x<=a[i].x2&&y>=a[i].h){
            insert(0,x,y,left(i),a[i].x1,a[i].h);
            insert(0,x,y,right(i),a[i].x2,a[i].h);
            sg=false;
            break;
            }
        }
    if(sg&&y<=lim){
        printf("%d",y);
        return;
        }
    spfa(0);
    printf("%d",d[2*n+1]);
    destory();
}
int main()
{      
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        datain();
        work();
        printf("\n");
        }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator