1094. The Largest Generation (25)

来源:互联网 发布:苹果手机频谱软件 编辑:程序博客网 时间:2024/06/08 16:58
/*法一:孩子节点用动态数组,队列中存的是完整的节点信息而非一个节点的序号,用数组存层数和该层孩子数。*/#include<iostream>#include<queue>#include<vector>//#pragma warning(disable:4996)using namespace std;#define MAX 101   //常量的定义/*序号,层数,孩子个数,孩子数组,其中序号可用node数组下标来表示*/struct node{    int level;    vector<int> child;//动态数组存孩子};int main(){    //freopen("input.txt","r",stdin);    node tree[MAX];    int N,M;    cin>>N>>M;    for(int i=0;i<M;i++){        int index,k;        cin>>index>>k;        for(int j=0;j<k;j++){            int childId;            cin>>childId;           tree[index].child.push_back(childId);        }    }    queue<node> q;    int root=1;   tree[root].level=1;    q.push(tree[root]);//01号整个节点插入    int maxLevel=1,maxCount=0;    int countLevel[MAX]={101};//下标表示层数,下标对应的数组元素表示该层节点数,    while(!q.empty()){ //BFS广度优先用队列        node curNode=q.front();  q.pop();        countLevel[curNode.level]++;        if(countLevel[curNode.level]>maxCount){            maxCount=countLevel[curNode.level];            maxLevel=curNode.level;        }        for(int i=0;i<curNode.child.size();i++){            tree[curNode.child[i]].level=curNode.level+1;            q.push(tree[curNode.child[i]]);        }    }    cout<<maxCount<<" "<<maxLevel<<endl;    return 0;}> http://blog.csdn.net/flx413/article/details/52641124
/*法2:比法一low一些*/#include<iostream>#include<queue>//#pragma warning(disable:4996)using namespace std;#define MAX 101   //常量的定义/*序号,层数,孩子个数,孩子数组,其中序号可用node数组下标来表示*/struct node{    int level;    int k;    int child[MAX];};int main(){    //freopen("input.txt","r",stdin);    node tree[MAX];    int N,M;cin>>N>>M;    for(int i=1;i<=N;i++){ //下标从1开始,下标为节点序号        tree[i].level=1;            tree[i].k=0;    }    for(int i=0;i<M;i++){        int index;cin>>index;cin>>tree[index].k;        for(int j=0;j<tree[index].k;j++){            cin>>tree[index].child[j];        }    }/*在纸上画一棵树,有5个结点.根是1,他的左孩子是3,右孩子是5,3的孩子是2,2的孩子是4按照下面这个执行过程,就刚才箭头指的那个位置开始,1号结点是根结点,层是1他有两个孩子分别是3和5,那么3和5的level是2,然后开始访问2号结点了,2的孩子是4,但是此时2这个结点level还是1(初始化),这个是错误的.    for(int i=1;i<=N;i++){        for(int j=0;j<tree[i].k;j++){            tree[tree[i].child[j]].level=tree[i].level+1;        }    }*/    queue<node> q;    int root=1; tree[root].level=1;    q.push(tree[root]);//01插入    int lev=1,cnt=0; //lev某层,cnt某层的叶子节点数    int maxlev=1,maxcnt=0;    while(!q.empty()){ //BFS广度优先用队列        node curNode=q.front();q.pop();        int curlev=curNode.level;        if(curlev!=lev){            if(cnt>maxcnt){                maxcnt=cnt;                maxlev=lev;            }            cnt=0;            lev=curlev;        }        cnt++;        for(int i=0;i<curNode.k;i++){            tree[curNode.child[i]].level=curNode.level+1;            q.push(tree[curNode.child[i]]);        }    }    if(cnt>maxcnt){//考虑到如果最后一层是最多节点的情况        maxcnt=cnt;        maxlev=lev;    }    cout<<maxcnt<<" "<<maxlev<<endl;    return 0;}
0 0
原创粉丝点击