C++ 在图中查找入度为零的节点

C++ Find a node with zero in-degree in graph

本文关键字:节点 入度 查找 C++      更新时间:2023-10-16

>我用map实现了一个图

map<char,vector<char> > M;

现在,我一个接一个地获得边缘,并将它们推入这样的图形中

addEdge(char a,char b){
M[a].push_back(b);
}

我想找到度数为零的所有节点。最有效的方法是什么?

创建一个将存储最终节点的vector<char> L

  1. 启动它以包含所有节点。
  2. 对于每个边 (a,b(:如果 b 在L 中,请将其从 L 中删除。

由仅包含边的数据结构表示的图形中,不能有零度的节点。因此,如果你的图完全由 M[] 描述,则保证没有零次节点。

我认为

如果我们采用另一个映射"indegree",如下面的代码所示,并增加计数,如果字符显示为边缘的终止端,那么我们可以找到 indegree 0 的节点。

map<char,vector<char> > M;
map<char,int> indegree;     
void addEdge(char a,char b){    
        M[a].push_back(b);                  
        indegree[b]++;
}
void show(){
        for(map<char,vecotr<char> > :: iterator it=M.begin();it!=M.end();it++){
                if(indegree[it->first]==0)
                        cout<<it->first<<endl;
        }
}       

另一种方法是预定义大小为 256 的数组,并遵循与上述相同的过程。

map<char,vector<char> > M;
int arr[256]={0};
void addEdge(char a,char b){    
        M[a].push_back(b);                  
        arr[b]++;
}
void show(){
        for(map<char,vecotr<char> > :: iterator it=M.begin();it!=M.end();it++){
                if(arr[it->first]==0)
                        cout<<it->first<<endl;
        }
}