确定排名顺序问题
dfs : 以每个顶点正向和反向(反向存图)分别遍历一次,就可以求出该顶点的出度和如度之和。满足 D入 + D出 == N-1,就可以确定其排名。参见离散数学。
floyd : relation[i][j] = 1 或者 relation[j][i] = 1 表示 i,j 之间有关系。若某一个顶点与其余 n-1个顶点都有关系的话,其排名是确定的。求任意两个顶点之间是否有关系可以用floyd算法。
注意是有向图
#include <iostream> #include <memory.h> using namespace std; int G[105][105]; int Indegree[105]; int Outdegree[105]; int N,M; void Floyd() { for( int u = 1; u <= N; u++ ) for( int v = 1; v <= N; v++ ) for( int w = 1; w <= N; w++ ) { if( G[v][u] && G[u][w] ) { G[v][w] = 1; } } } int main() { cin >> N >> M; memset(G, 0, sizeof(G)); memset(Outdegree, 0, sizeof(Outdegree)); memset(Indegree, 0, sizeof(Indegree)); while( M-- ) { int Begin,End; cin >> Begin >> End; G[Begin][End] = 1; } Floyd(); for( int i = 1; i <= N; i++ ) for( int j = 1; j <= N; j++ ) { if( G[i][j] ) { Indegree[j]++; Outdegree[i]++; } } int num = 0; for( int i = 1; i <= N; i++ ) { if( Indegree[i] + Outdegree[i] == N-1 ) num++; } cout << num << endl; return 0; }