MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 3439 Server Relocation

Posted on 2011-06-25 11:12  MDeath-Kid  阅读(327)  评论(0编辑  收藏  举报
/*8785404 MDK 3439 Accepted 9544K 4297MS G++ 2604B 2011-06-24 17:41:22 */
//博客园不给力啊,这么破的编辑器,就是花瓶,动一点就碎!我足足打了三遍注释!!!!
/*题目大意就是求出计算机从开始到destination走的最少点数,化成最短路,我一开始用的邻接表,果断TLE了,因为1000个点边的个数m可能很大,所以用邻接阵存,4000MS,多余计算还是很多,用BFS应该2000MS左右就能过了*/
#define MAXN 1500
#define inf 1000000000
typedef int elem_t;
int minl[MAXN];int mat[MAXN][MAXN];
void dijkstra(int n,int s){
    int i,j,k;
    int v[MAXN]={0};
    for(i=0;i<n;i++) minl[i]=inf;
    for(minl[s]=0,i=0;i<n;i++)
    {
        for(k=-1,j=0;j<n;j++)
        if(!v[j]&&((k==-1)||minl[j]<minl[k]))
            k=j;
        for(v[k]=1,j=0;j<n;j++)
        if(!v[j]&&mat[k][j])
            minl[j]=min(minl[k]+1,minl[j]);
    }
}
typedef pair<double,double> pa;
pa p[MAXN];
 
inline double dis(pa a,pa b)
{
    return (a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second);
}
int main()
{
 
    //freopen("d:\\2.txt","r",stdin);
    int N;SCF(N);
    while(N--)
    {
        SET(mat,0);
        int n,a,b,tm1,tm2;double s1,s2;
        scanf("%d %d %d %lf %lf",&n,&a,&b,&s1,&s2);
        double s=pow(s1+s2,2);
        F(i,n)
        {
            SCFD(tm1,tm2);
            p[i].first=tm1;
            p[i].second=tm2;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i;j<n;j++)
            {
                if(dis(p[i],p[j])<=s)
                {
                    mat[i][j]=mat[j][i]=1;
                }
            }
        }
        dijkstra(n,a-1);
        int si=minl[b-1];
        if(si<inf)
        PCFLN(si);
        else
        printf("Impossible\n");
    }
}

//而且这里的距离函数可以小小的优化下。