廣搜找森林的深度和寬度
#include <iostream>
#include <memory.h>
#include <vector>
#include <deque>
using namespace std;
int is_visited[110];
int forest[110][110];
int all_level_width[110];
int flag;
int n;
int depth, width;
vector<int> roots;
void add_root() {
int i,j;
int sum = 0;
for (i=1;i<=n;i++) {
sum = 0;
for (j=1;j<=n;j++) {
sum+=forest[j][i];
}
if (sum ==0)
roots.push_back(i);
}
}
bool BFS_tree(int root) {
deque<int> q;
q.push_back(root);
int t, i;
int d = -1;
int size;
//size = q.size();
while (!q.empty()) {
size = q.size();
d++;
all_level_width[d]+=size;
while (size--) {
t = q.front();
q.pop_front();
for (i=1;i<=n;i++) {
if (forest[t][i]==1) {
if (is_visited[i]==0) {
q.push_back(i);
is_visited[i] = 1;
}
else
return false;
}
}
}
}
if (d > depth)
depth = d;
return true;
}
int main() {
int m;
int i,x,y;
cin >> n >> m;
while (n!=0) {
memset(is_visited, 0 ,sizeof(is_visited));
memset(forest, 0, sizeof(forest));
memset(all_level_width, 0, sizeof(all_level_width));
roots.clear();
for (i=0;i<m;i++) {
cin >> x >> y;
forest[x][y] = 1;
}
depth = 0;
width = 0;
flag = 1;
for (i=1;i<=n;i++) {
if (forest[i][i]==1) {
flag = 0;
break;
}
}
add_root();
if (roots.size()==0)
flag = 0;
if (flag == 1) {
for (i=0;i<roots.size();i++) {
is_visited[roots[i]]=1;
if (BFS_tree(roots[i])==false) {
flag = 0;
break;
}
}
}
for (i=0;i<110;i++) {
if (all_level_width[i] > width)
width = all_level_width[i];
}
// cout << "result:\n" << endl;
if (flag == 0)
cout << "INVALID\n";
else
cout << depth << " " << width << endl;
cin >> n >> m;
}
return 0;
}