您的位置:首页 > 其它

PAT(Advanced Level) 1004 Counting Leaves 解题报告

2013-10-21 16:12 429 查看
题目链接http://pat.zju.edu.cn/contests/pat-a-practise/1004
本题要求计算输出给定的树中各深度的叶节点个数。有两种思路可以解决该问题:
Solution 1: 使用树的层序遍历;
Solution 2: 使用图的DFS(树本身就是一种特殊的图,所以DFS也是适用的)。
比较一下,第二种思路的代码貌似更简洁。
下面给出笔者的C++实现代码:
Solution 1 层序遍历
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

vector<int> tree[101];
int num[101];

struct node
{
int id,level; //level是一个辅助变量,用于标记当前树节点在树中的深度
node(int _id, int _level=0):id(_id),level(_level)
{}
};
queue<node> q;

int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int id,k;
cin>>id>>k;
while(k--)
{
int temp;
cin>>temp;
tree[id].push_back(temp);
}
}

q.push(node(1,0));
int max_level=0;
while(!q.empty())
{
node cur=q.front();
q.pop();
max_level=cur.level;
if(tree[cur.id].size()!=0)
{
for(int j=0;j<tree[cur.id].size();j++)
{
node nd(tree[cur.id][j],cur.level+1);
q.push(nd);
}
}
else
num[cur.level]++;
}

cout<<num[0];
for(int i=1;i<=max_level;i++)
cout<<" "<<num[i];
cout<<endl;

//system("pause");
return 0;
}

Solution 2 DFS
#include<iostream>
#include<vector>
using namespace std;

vector<int> graph[101];
int num[101];		//记录各个深度中叶节点的个数(根节点深度为0)
int maxlevel;		//记录数的最大深度(全局变量会自动初始化为0)
bool visited[101];         //标记树中的节点是否被访问过(会自动初始化为false)
void dfs(int vertex, int cur_level, int& max_level)
{
max_level=cur_level>max_level?cur_level:max_level;
visited[vertex]=true;
if(graph[vertex].size()!=0)
{
for(int i=0;i<graph[vertex].size();i++)
if(!visited[ graph[vertex][i] ] )
dfs(graph[vertex][i], cur_level+1,max_level);
}
else
num[cur_level]++;
}

int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int id,k;
cin>>id>>k;
while(k--)
{
int temp;
cin>>temp;
graph[id].push_back(temp);
}
}
dfs(1,0,maxlevel);
cout<<num[0];
for(int i=1;i<=maxlevel;i++)
cout<<" "<<num[i];
cout<<endl;
//system("pause");
return 0;
}


 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 PAT