吝啬的国度

1、广搜(从结点s开始  往外逐层搜索)

# include<iostream>
# include<string>
# include<queue>
# include<stdio.h>
using namespace std;
int u[200005],v[200005],w[200005],first[200005],next[200005],d[200005];
queue<int> q;
int main()
{
      int n,m,s;
      cin>>m;
      while(m--)
      {
          cin>>n>>s;
          int i,k;
          for(i=1;i<=2*n;i++)
              first[i] = -1;
          for(i=1;i<2*n-1;i+=2)                        //无向边相当于两条有向边
          {
              scanf("%d %d",&u[i],&v[i]);
              u[i+1] = v[i];
              v[i+1] = u[i];
              w[i] = 1;                             //w[i]=1表示该路径尚未经过
              w[i+1] = 1;
              d[i] = 0;
              d[i+1] = 0;
              next[i] = first[u[i]];
            first[u[i]] = i;    
            
            next[i+1] = first[u[i+1]];
            first[u[i+1]] = i+1;
        }
        
    //    for(i=1;i<2*n-1;i++)
    //        printf("%d %d %d %d %d\n",first[i],next[i],u[i],v[i],w[i]) ;
        
        
        q.push(first[s]);
        int count = n;
        
        while(!q.empty())
        {
            k = q.front();
            q.pop();
            while(k!=-1 && w[k]!=0)
            {
                if(d[v[k]]==0)
                {
                    d[v[k]] = u[k];
                }
                w[k] = 0;
                q.push(first[v[k]]);
                k = next[k];
            }

        }
        
        for(i=1;i<=n;i++)
        {
            if(i!=s)
                printf("%d",d[i]);
            else
                printf("-1");
            if(i!=n)
                printf(" ");
            else
                printf("\n");
        }
    }
    return 0;
} 

 

posted @ 2018-08-15 15:06  萌新上路  阅读(109)  评论(0编辑  收藏  举报