这题坑死我了,昨天调到现在,其实算法问题一点都没,就是想当然了,以为输入编号都是从小到大的。
别的没什么好说了,直接dfs。直接dijkstra的话要超时。。。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
queue<int>q;
int t,nz,nr;
int s[10010],num[10010],d[10010][12],a[500];
int dis[210][10010];
bool flag[10010];
void dijkstra(int st,int cou)
{
int i,j;
memset(flag,0,sizeof(flag));
while(!q.empty())q.pop();
flag[st]=1;
q.push(st);
for(i=1;i<=nz;i++)dis[cou][s[i]]=(s[i]==st?0:100000);
while(!q.empty())
{
int x=q.front();
q.pop();
for(i=1;i<=num[x];i++)
{
int y=d[x][i];
if(!flag[y])
{
q.push(y);
dis[cou][y]=dis[cou][x]+1;
flag[y]=true;
}
}
}
}
int main()
{
int i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&nz,&nr);
for(i=1;i<=nz;i++)
{
scanf("%d",&s[i]);
scanf("%d",&num[s[i]]);
for(j=1;j<=num[s[i]];j++)
scanf("%d",&d[s[i]][j]);
}
int h;
j=1;
while(nr--)
{
scanf("%d",&h);
while(h--)
{
scanf("%d",&a[j]);
dijkstra(a[j],j);
j++;
}
}
/*for(i=1;i<j;i++)
{
printf(" %d\n",a[i]);
for(int k=1;k<=nz;k++)
printf("%d %d %d\n",i,k,dis[i][a[k]]);
}*/
int value=10000,all=j-1,kk;
for(i=1;i<=nz;i++)
{
int now=0;
for(j=1;j<=all;j++)
if(dis[j][s[i]]>now)
now=dis[j][s[i]];
if(value>now)
{
value=now;
kk=s[i];
}
else if(now==value&&s[i]<kk)
kk=s[i];
}
printf("%d %d\n",value+1,kk);
}
}