(PAT)1004.Counting Leaves (30)

来源:互联网 发布:康师傅手机 windows 编辑:程序博客网 时间:2024/05/29 21:16

核心是个广度优先算法,利用C++的知识可以写的更简洁一点,为了联系C,故用数组代替,自己模拟一下队列以及记录当前层次以及下一层。

#include<stdio.h>#include<string.h>int n,m;int level[100+10];int family[100+10][100+10];int parse(char s[3]){    if(s[0]=='0')return (s[1]-'0');    else {        if(strlen(s)==1)return (s[0]-'0');            else return (s[0]-'0')*10+(s[1]-'0');    }}void bfs(){    int queue[100+10];    for(int i=0;i<100+10;i++) queue[i]=0;    int start=0;    int end=0;    int nextLevel=1;    int curLevel=1;    queue[start]=1;    end=1;    nextLevel=start+1;    while(start<end)    {        if(start==nextLevel)        {            printf("%d ",level[curLevel]);            nextLevel=end;            curLevel++;        }        bool leaf=true;        for(int i=1;i<=n;i++)        {            if(i==queue[start])continue;            if(family[queue[start]][i]==1)            {                queue[end++]=i;                leaf=false;            }        }        if(leaf) level[curLevel]++;        start++;    }    printf("%d",level[curLevel]);}int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)    {        level[i]=0;         for(int j=0;j<n;j++)            family[i][j]=0;    }    for(int i=0;i<m;i++)    {        char pa[3];        int chNum;        scanf("%s %d",pa,&chNum);        for(int i=0;i<chNum;i++)        {            char child[3];            scanf("%s",child);            int paInt=parse(pa);            int chInt=parse(child);            family[paInt][chInt]=1;        }    }    bfs();}


0 0