ZOJ 4124 Median (拓撲 DFS)

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6026

拓撲排序判斷環是否存在,DFS搜1~n大於/小於i的元素數量

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#define eps 1e-8
using namespace std;
typedef long long ll;
static const int MAX_N = 1e2 + 5;
static const ll Mod = 233;
static const int INF = 0x3f3f3f3f;
vector<int>veh[MAX_N];
vector<int>vel[MAX_N];
int in[MAX_N], cnth[MAX_N], cntl[MAX_N];
bool vis[MAX_N];
int n;
bool topolog(){
    queue<int>q;
    for(int i = 1; i <= n; ++i) if(!in[i]) q.push(i);
    while(!q.empty()){
        int now = q.front();
        q.pop();
        if(!vis[now]){
            vis[now] = true;
            for(int i = 0; i < vel[now].size(); ++i){
                int v = vel[now][i];
                if(--in[v] == 0) q.push(v);
            }
        }
    }
    for(int i = 1; i <= n; ++i){
        if(!vis[i]) return false;
    }
    return true;
}
void dfs(int u, int &rev, bool fg){    //這裏dfs有待改進,傳參vector更好,但不會...
    vis[u] = true;
    if(fg){
         for(int i = 0; i < vel[u].size(); ++i){
            int v = vel[u][i];
            if(!vis[v]){
                ++rev;
                vis[v] = true;
                dfs(v, rev, fg);
            }
        }
    }
    else{
        for(int i = 0; i < veh[u].size(); ++i){
            int v = veh[u][i];
            if(!vis[v]){
                ++rev;
                dfs(v, rev, fg);
            }
        }
    }
}
int main(){
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int T;
    scanf("%d", &T);
    while(T--){
        int m;
        scanf("%d%d", &n, &m);
        for(int i = 0; i <= n; ++i){
            vel[i].clear();
            veh[i].clear();
            vis[i] = false;
            in[i] = 0;
            cnth[i] = 0;
            cntl[i] = 0;
        }
        for(int i = 0; i < m; ++i){
            int u, v;
            scanf("%d%d", &u, &v);
            vel[u].push_back(v);
            veh[v].push_back(u);
            ++in[v];
        }
        if(!topolog()) for(int i = 1; i <= n; ++i) putchar('0');
        else{
            bool fg = true;
            for(int i = 1; i <= n; ++i){
                memset(vis, false, sizeof(vis));
                int rev = 0;
                dfs(i, rev, fg);
                cntl[i] = rev;
            }
            fg = false;
            for(int i = 1; i <= n; ++i){
                memset(vis, false, sizeof(vis));
                int rev = 0;
                dfs(i, rev, fg);
                cnth[i] = rev;
            }
            int mv = (n - 1) >> 1;
            for(int i = 1; i <= n; ++i){
                putchar(cntl[i] <= mv && cnth[i] <= mv ? '1' : '0');
            }
        }
        putchar('\n');
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章