PAT 1076. Forwards on Weibo (30)

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1076

此题考查图的遍历操作:

本来我个人觉得可以用dfs的,但是不知何故,有两个case没有过,贴出代码,望指出错误之处:

#include <cstdio>
#include <map>
#include <vector>
#include <memory.h>
using namespace std;

const int NUM=1001;
bool visited[NUM];
int forwards;
map<int,vector<int> > adjlist;

void reset()
{
    memset(visited,false,sizeof(bool)*NUM);
    forwards=0;
}

void dfs(int sourceNode,int indLevel,int L)
{
    if(indLevel>L)
        return;
    for(vector<int>::iterator iter=adjlist[sourceNode].begin();iter!=adjlist[sourceNode].end();++iter)
    {
        if(!visited[*iter])
        {
            ++forwards;
            visited[*iter]=true;
            dfs(*iter,indLevel+1,L);
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int N,L;
    scanf("%d %d",&N,&L);
    if(L>6)
        L=6;
    int i,Mi,j,followed;
    for(i=1;i<=N;++i)
    {
        scanf("%d",&Mi);
        for(j=0;j<Mi;++j)
        {
            scanf("%d",&followed);
            adjlist[followed].push_back(i);
        }
    }
    int K,query;
    scanf("%d",&K);
    for(i=0;i<K;++i)
    {
        scanf("%d",&query);
        reset();
        visited[query]=true;
        dfs(query,1,L);
        printf("%d\n",forwards);
    }
    return 0;
}
View Code

 

后来换了bfs后,AC了:

#include <cstdio>
#include <map>
#include <vector>
#include <queue>
#include <memory.h>
using namespace std;

const int NUM=1001;

bool  hasForward[NUM];
int forwards;
map<int,vector<int> > adjlist;
queue<int> recordQueue;

void reset()
{
    memset(hasForward,false,sizeof(bool)*NUM);
    forwards=0;
    while(!recordQueue.empty())
        recordQueue.pop();
}

void bfs(int query,int level)
{
    int curLevel=1;
    hasForward[query]=true;
    recordQueue.push(query);
    int endOfLevel=recordQueue.back();
    int cur;
    while(!recordQueue.empty()&&curLevel<=level)
    {
        cur=recordQueue.front();
        recordQueue.pop();
        for(vector<int>::iterator iter=adjlist[cur].begin();iter!=adjlist[cur].end();++iter)
        {
            if(!hasForward[*iter])
            {
                recordQueue.push(*iter);
                ++forwards;
                hasForward[*iter]=true;
            }
        }
        if(cur==endOfLevel)
        {
            ++curLevel;
            endOfLevel=recordQueue.back();
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    int N,L;
    scanf("%d %d",&N,&L);
    if(L>6)
        L=6;
    int i,j;
    int Mi,followed;
    for(i=1;i<=N;++i)
    {
        scanf("%d",&Mi);
        for(j=0;j<Mi;++j)
        {
            scanf("%d",&followed);
            adjlist[followed].push_back(i);
        }
    }
    int K,query;
    scanf("%d",&K);
    for(i=0;i<K;++i)
    {
        scanf("%d",&query);
        reset();
        bfs(query,L);
        printf("%d\n",forwards);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/wwblog/p/3709216.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值