Sicily 1034 Forest

廣搜找森林的深度和寬度

#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;
}                    


發佈了144 篇原創文章 · 獲贊 7 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章