Thursday, May 26, 2011

11377 - Airport Setup


#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define M 2010
#define MAXINT 2147483647
using namespace std;

int HAF[M],List[M][M],adjNo[M];
int DjKastra(int,int);

int main()
{
    int t,c,i,x,y,m,n,k,q;
    freopen("in.txt","r",stdin);
    scanf("%d",&t);

    for(c=1;c<=t;c++)
    {
        for(i=0;i<M;i++)
            HAF[i] = 1, adjNo[i] = 0;
       
        scanf("%d%d%d",&n,&m,&k);

        for(i=0;i<k;i++)
        {
            scanf("%d",&x);
            HAF[x] = 0;
        }

        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            List[x][adjNo[x]++] = y;
            List[y][adjNo[y]++] = x;
        }

        scanf("%d",&q);
        printf("Case %d:\n",c);

        for(i=0;i<q;i++)
        {
            scanf("%d%d",&x,&y);
            if(x==y)
            {
                printf("0\n");
                continue;
            }
            n = DjKastra(x,y);
            printf("%d\n",n);
        }
        printf("\n");
    }
    return 0;
}

int DjKastra(int x,int y)
{
    priority_queue<pair<int,int> >Q;
    pair <int,int> tmp;
    int i, j,d[M],t;
    bool Visited[M],flag;
   
    memset(Visited,false,sizeof(Visited));
    for(i=0;i<M;i++)d[i]=MAXINT;
    d[x] = (HAF[x])?1:0;
    Q.push(pair <int,int>(d[x],x));
   
    while(!Q.empty())
    {
        tmp = Q.top();Q.pop();
        i = tmp.second;
        Visited[i] = true;
        if(i==y)return d[y];

        for (j = 0; j<adjNo[i]; j++)
        {
            t = List[i][j];
            if(!Visited[t] && d[t] > d[i] + HAF[t])
            {
                d[t] = d[i] + HAF[t];
                Q.push(pair <int,int>(-d[t], t));
            }
        }
    }
    return -1;
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.