sicily 1034. Forest
生活随笔
收集整理的這篇文章主要介紹了
sicily 1034. Forest
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
題意:有n個結點,有m條邊A->B,判斷是不是森林,
如果一結點有兩個結點以上同時指向它,即它的入度>1, 或者有環 , 即沒有根節點,則不是森林,
若是森林的話,則輸出它的深度和寬度, 寬度是指結點數最多的那一層
*/
#include<iostream> // 求森林深度和寬度
#include<stdio.h>
#include<cstring>
#include <algorithm>
using namespace std;
#define maxn 120
int g[maxn][maxn];
int in[maxn],height[maxn]; // in[i]表示結點i的入度數, height[i]表示結點i的高度
int width[maxn]; // width[i]表示在高度i上的結點數
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)&&n)
{
int suc=1;
memset(g,0,sizeof(g));
memset(in,0,sizeof(in));
int a,b;
while(m--)
{
scanf("%d%d",&a,&b); //結點下標從 1開始
g[a][b]=1;
if(in[b]==0)
in[b]=1;
else //說明有兩條邊指向同個結點
suc=0;
}
if(!suc)
{
printf("INVALID\n");
continue;
}
memset(width,0,sizeof(width));
int q[maxn]; //隊列存儲入度為0的節點
int front=0,rear=0;
for(i=1;i<=n;i++)
{
if(in[i]==0)
{
q[rear++]=i; //把根節點壓入棧
height[i]=0;
width[0]++; //一開始所有的根結點都在第0層,高度為 0
}
}
if(rear==0) //找不到根結點,說明有環
{
printf("INVALID\n");
continue;
}
int num=0; // num記錄遍歷過的結點數
while(front<rear)
{
num++;
int t=q[front++]; //結點t
for(i=1;i<=n;++i)
{
if(g[t][i])
{
height[i]=height[t]+1; //兒子節點的高度比父節點的高度大 1
width[height[i]]++; //在這一高度上的結點數加 1
q[rear++]=i;
}
}
}
if(num<n) //環內任意結點的入度都至少為1,都不會被壓入隊列,所以小于n說明存在環
{
printf("INVALID\n");
continue;
}
printf("%d %d\n",*max_element(height+1,height+n+1),*max_element(width,width+n));
// 輸出森林的高度和寬度,注意 height[i] 表示結點i的高度,而 width[i] 表示在高度i上的寬度
// 高度的范圍是從0到n-1,因為根結點是在第0層
}
return 0;
}
題意:有n個結點,有m條邊A->B,判斷是不是森林,
如果一結點有兩個結點以上同時指向它,即它的入度>1, 或者有環 , 即沒有根節點,則不是森林,
若是森林的話,則輸出它的深度和寬度, 寬度是指結點數最多的那一層
*/
#include<iostream> // 求森林深度和寬度
#include<stdio.h>
#include<cstring>
#include <algorithm>
using namespace std;
#define maxn 120
int g[maxn][maxn];
int in[maxn],height[maxn]; // in[i]表示結點i的入度數, height[i]表示結點i的高度
int width[maxn]; // width[i]表示在高度i上的結點數
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)&&n)
{
int suc=1;
memset(g,0,sizeof(g));
memset(in,0,sizeof(in));
int a,b;
while(m--)
{
scanf("%d%d",&a,&b); //結點下標從 1開始
g[a][b]=1;
if(in[b]==0)
in[b]=1;
else //說明有兩條邊指向同個結點
suc=0;
}
if(!suc)
{
printf("INVALID\n");
continue;
}
memset(width,0,sizeof(width));
int q[maxn]; //隊列存儲入度為0的節點
int front=0,rear=0;
for(i=1;i<=n;i++)
{
if(in[i]==0)
{
q[rear++]=i; //把根節點壓入棧
height[i]=0;
width[0]++; //一開始所有的根結點都在第0層,高度為 0
}
}
if(rear==0) //找不到根結點,說明有環
{
printf("INVALID\n");
continue;
}
int num=0; // num記錄遍歷過的結點數
while(front<rear)
{
num++;
int t=q[front++]; //結點t
for(i=1;i<=n;++i)
{
if(g[t][i])
{
height[i]=height[t]+1; //兒子節點的高度比父節點的高度大 1
width[height[i]]++; //在這一高度上的結點數加 1
q[rear++]=i;
}
}
}
if(num<n) //環內任意結點的入度都至少為1,都不會被壓入隊列,所以小于n說明存在環
{
printf("INVALID\n");
continue;
}
printf("%d %d\n",*max_element(height+1,height+n+1),*max_element(width,width+n));
// 輸出森林的高度和寬度,注意 height[i] 表示結點i的高度,而 width[i] 表示在高度i上的寬度
// 高度的范圍是從0到n-1,因為根結點是在第0層
}
return 0;
}
轉載于:https://www.cnblogs.com/mjc467621163/archive/2011/07/04/2097673.html
總結
以上是生活随笔為你收集整理的sicily 1034. Forest的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Jboss/Tomcat/Jetty
- 下一篇: Code Generate of Pow