拓扑序列 + dfs + 读题

这个题感觉很坑,光题面上就有一个地方没说明白; 先建图判一下拓扑序列,合法的话就对每个点进行爆搜。搜下大于它的点的个数和小于它的点的个数,都小于(n + 1) / 2就输出1, 否则输出0; 坑点1:dfs搜的时候必须判断这个点有没有在本次搜过,否则会tle 坑点2:注意审题


using namespace std;

const int N = 110;

vector<int> g[N], gg[N];
int d[N];
int n, m;
bool st1[N], st2[N];

bool bfs() {
    queue<int> q;
    int cnt = 0;
    for(int i = 1; i <= n; i ++ )
        if(d[i] == 0) q.push(i), cnt ++;
        
    
    while(!q.empty()) {
        int t = q.front();
        q.pop();
        for(auto it : g[t]) {
            d[it] --;
            if(d[it] == 0) {
                q.push(it);
                cnt ++;
            }
        }
    }
    
    if(cnt == n) return true;
    else return false;
}


int ddfs(int u) {
    int cnt = 0;
    st1[u] = 1;
    for(int v : g[u]) {
        if(!st1[v]) {
            cnt += ddfs(v) + 1;
        }
    }
    
    return cnt;
}

int udfs(int u) {
    int cnt = 0;
    st2[u] = 1;
    for(int v : gg[u]) {
        if(!st2[v]) {
            cnt += udfs(v) + 1;
        }
    }
    
    return cnt;
}

int main()
{
    int T;
    scanf("%d", &T);
    
    while(T -- ) {
        
        scanf("%d%d", &n, &m);
        
        for(int i = 1; i <= n; i ++ ) g[i].clear(), d[i] = 0, gg[i].clear();
        
        while(m -- ) {
            int a, b;
            scanf("%d%d", &a, &b);
            g[a].push_back(b);
            gg[b].push_back(a);
            d[b] ++;
        }
        
        bool has = bfs();
        //cout << has << endl;
        if(has) {
            
            for(int i = 1; i <= n; i ++ ) {
                memset(st1, 0, sizeof st1), memset(st2, 0, sizeof st2);
                if(udfs(i) <= n / 2 && ddfs(i) <= n / 2) {
                    putchar('1');
                }
                else putchar('0');
            }
        }
        else {
            for(int i = 1; i <= n; i ++ ) putchar('0');
        }
        
        putchar('\n');
    }
    
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 11:29
已编辑
斯卡蒂味的鱼汤:知道你不会来数马,就不捞你😂最近数马疯狂扩招,招聘要求挺低的,你能力肯定够,应该就是因为太强了,知道你不会来才不捞你
投递腾讯云智研发等公司7个岗位
点赞 评论 收藏
分享
11-12 14:30
已编辑
广东科技学院 前端工程师
迷茫的小刺猬在迎接o...:前端岗位越来越少了,中小厂也更倾向全栈了,更不需要初级或者实习。可能就大厂才会有一些岗位,但是很看学历。
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务