P1347 排序 题解

题干

交了8次,下载了3个测点.....

首先这个题,很容易想到用拓扑

如果有“X<Y”,就建立一条从X到Y的有向边

要考虑到,如果排序成立,必须满足入度为0的点只有一个并且出度为0的点只有一个

并且在拓扑排序的时候,不可以出现同一时间有两个节点入度为0

其中判断环,用一个dfs来做,方式如下:

理论基础

复制代码
int dfs( int p,int from,bool bol ){ 
    //p是当前节点编号,from是dfs起点,bol是为了避免在起点就弹出
    if( p == from && bol ) //回到了起点
        return 1;
    if( vis[p] && bol ) return 0;//避免死循环(很重要!)
    vis[p] = 1;
    for( int i = head[p];i;i = e[i].next ){
        int to = e[i].to;
        if( dfs(to,from,1) ) return 1;
    }
    return 0;
}

//main函数中
//判断环
FOR( i,1,n ){
    memset( vis,0,sizeof(vis) );
    vis[i] = 1;
    if( dfs(i,i,0) ){ //有矛盾
        cout << "Inconsistency found after " << ffi << " relations." << endl;
        err = 1;
        break;
    }
}
dfs 判断环
复制代码

其中一定一定要判断这个死循环,否则TLE或MLE(炸栈)

判断入度出度的时候,用一个int变量就行了,不要开数组

posted @   little_sheep_xiaoen  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示