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 @ 2022-09-23 17:46  little_sheep_xiaoen  阅读(17)  评论(0编辑  收藏  举报