zoukankan      html  css  js  c++  java
  • PAT甲题题解-1076. Forwards on Weibo (30)-BFS

    题目大意:给出每个用户id关注的人,和转发最多的层数L,求一个id发了条微博最多会有多少个人转发,
    每个人只考虑转发一次。
    用BFS,同时每个节点要记录下所在的层数,由于只能转发一次,所以每个节点要用vis判断之前是否入过队列,不能重复入队。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #include <cmath>
    #include <queue>
    using namespace std;
    const int maxn=1005;
    int vis[maxn];
    int head[maxn];
    int tot;
    int ans=0;
    struct Edge{
        int to;
        int next;
    }edge[maxn*100];
    
    void init(){
        tot=0;
        memset(head,-1,sizeof(head));
    }
    void add(int u,int v){
        edge[tot].to=v;
        edge[tot].next=head[u];
        head[u]=tot++;
    }
    
    struct Node{
        int u;
        int layer;
    };
    void BFS(int u,int L){
        queue<Node> q;
        Node s,tmp;
        s.u=u;
        s.layer=0;
        q.push(s);
        while(!q.empty()){
            tmp=q.front();
            q.pop();
            if(tmp.layer>L)
                break;
            if(tmp.layer!=0)
                ans++;
            for(int k=head[tmp.u];k!=-1;k=edge[k].next){
                int v=edge[k].to;
                if(!vis[v]){
                    s.u=v;
                    s.layer=tmp.layer+1;
                    vis[v]=1;  //要注意这里就要标记vis=1,而不是从队列里取出来时标记,会超时。
                    q.push(s);
                }
            }
        }
    }
    int main()
    {
        int n,l,m,k,v;
        init();
        scanf("%d %d",&n,&l);
        for(int i=1;i<=n;i++){
            scanf("%d",&m);
            for(int j=0;j<m;j++){
                //注意题目,是i关注了m个人,也就是这m个人发布的消息能被i看到,建立v->i的边
                scanf("%d",&v);
                add(v,i);
            }
        }
        int id;
        scanf("%d",&k);
        for(int i=0;i<k;i++){
            scanf("%d",&id);
            memset(vis,0,sizeof(vis));
            vis[id]=1;
            ans=0;
            //dfs(id,0,l+1,id);
            BFS(id,l);
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    法语助手2010破解
    一个很简单的例子,从汇编层次理解函数调用
    ubuntu11.10配置IPV6
    linux创建 / 删除用户及用户管理
    设置gdb反汇编语法为intel
    ubuntu server 10.04 LTS(64位)装不了花生壳的解决方法
    实现windows和linux互传文件
    在ubuntu11.10中安装chrome浏览器
    poj 1755 Triathlon 半平面交判断不等式是否有解
    poj 1474 Video Surveillance 半平面交
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6390633.html
Copyright © 2011-2022 走看看