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; } }
其中一定一定要判断这个死循环,否则TLE或MLE(炸栈)
判断入度出度的时候,用一个int变量就行了,不要开数组