一、基环内向树性质:
1.是一个图,而不是一个树
2.所有节点的出度均为1
3.环外的节点指向环内的节点
二、如何找出基环内向树:
拓扑排序:记录所有节点的入度,拓扑排序后,入度为1的节点为环中的节点。
代码中g[i]代表i->g[i]的一条有向边
queue<int>q;
for(int i=0;i<n;++i){
if(degree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int cur=q.front();
q.pop();
if(--degree[g[cur]]==0){
q.push(g[cur]);
}
}
三、最大内向基环树:
遍历拓扑排序后所有入度不为0的点,即可找出最大内向基环树。
遍历过程中注意,因为入度都为1,因此遇到一个结点可以直接将其入度置为0,防止重复遍历。
for(int i=0;i<n;++i){
if(degree[i]==0){
continue;
}
degree[i]=0;
int max_ring_size=1;
for(int v=g[i];v!=i;v=g[v]){
++max_ring_size;
degree[v]=0;
}
ans=max(ans,max_ring_size);
}