日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sicily 1034. Forest

發布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;
}

轉載于:https://www.cnblogs.com/mjc467621163/archive/2011/07/04/2097673.html

總結

以上是生活随笔為你收集整理的sicily 1034. Forest的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。