#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.