Sicily 1034

蔚落 2022-08-06 07:09 125阅读 0赞



#include
#include
using namespace std;
int invalid_flag;
struct node{
int m; //记录指向该节点的节点
int n; //记录该节点的层次
};
int main()
{
int a,b;
while(cin>>a>>b)
{
if(a==0)
break;
invalid_flag=0;
int num[100][100]; //记录树的边
int root[100]; //root存放根节点,值为1表示是根节点
int level[100]; //记录第i个节点的层数
int width[100]; //记录第i层的宽度
queue q;
for(int i=0;i<a;i++)
{
root[i]=1;
level[i]=-1;
}
for(int i=0;i<a;i++)
for(int j=0;j<a;j++)
num[i][j]=0;

  1. for(int i=0;i<b;i++)
  2. \{
  3. int c=0,d=0;
  4. cin>>c>>d;
  5. c--;d--;
  6. root\[d\]=0; //判断是否为根节点
  7. num\[c\]\[d\]=1;
  8. \}
  9. for(int i=0;i<a;i++) //从根节点入队列,依次遍历
  10. if(root\[i\]==1)
  11. \{
  12. level\[i\]=0;

node temp={i,0};
q.push(temp);
}

  1. while(!q.empty())

{
node temp1=q.front(); //取出队列首个元素
q.pop();
for(int i=0;i<a;i++)
{
if(num[temp1.m][i]==1)
{
if(level[i]!=-1)
{
invalid_flag=1;
break;
}
else
{
level[i]=temp1.n+1;
node temp2={i,level[i]};
q.push(temp2);
}
}
}

if(invalid_flag==1)
break;
}

  1. for(int i=0;i<a;i++) //判断是否有节点未被访问
  2. if(level\[i\]==-1)
  3. \{
  4. invalid\_flag=1;
  5. break;
  6. \}

if(invalid_flag==1)
cout<<”INVALID”<<endl;
else
{
int max_e1=0;
int max_e2=0;
for(int i=0;i<a;i++)
width[i]=0;

  1. for(int i=0;i<a;i++) //求最深层数
  2. \{
  3. if(level\[i\]>max\_e1)
  4. max\_e1=level\[i\];
  5. width\[level\[i\]\]++; //得出第i层的宽度
  6. \}
  7. for(int i=0;i<a;i++) //求最宽节点数
  8. \{
  9. if(width\[i\]>max\_e2)
  10. max\_e2=width\[i\];
  11. \}
  12. cout<<max\_e1<<" "<<max\_e2<<endl;

}
}
return 0;
}

1.对于跳出双重循环,本来打算用goto,但最后还是想到了妥善的解决办法

2.SIcily中提交结果说明:

![Image 1][]

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读

    相关 sicily 1029

    思路:首先创建两个函数operate() 和cycle(),其中operate()求得两个大数之和,cycle()将数组向后平移一位。首先初始化数组num,数组num存储兔子的

    相关 [sicily] 1001. Alphacode

    ![这里写图片描述][20160511210803993] 题目大意: 假设有一规则:’A’ 设为1,’B’设为2,以此类推, ‘Z’设为26。按照这个规则给一串英文字母

    相关 PAT乙级1034

    1034 有理数四则运算 (20 分) 本题要求编写程序,计算 2 个有理数的和、差、积、商。 输入格式: 输入在一行中按照 `a1/b1 a2/b2` 的格式给出两