hdu 2377Bus Pass

来源:互联网 发布:蚂蚁金服 java 工资 编辑:程序博客网 时间:2024/05/19 17:58

这题坑死我了,昨天调到现在,其实算法问题一点都没,就是想当然了,以为输入编号都是从小到大的。

别的没什么好说了,直接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);}}