图论

来源:互联网 发布:德州金蝶软件 编辑:程序博客网 时间:2024/05/22 04:52

今天笔试碰到几个图论的问题,以前一直没有写过,所以今天写下:

1.拓扑排序

多个任务,有依赖关系,求任务执行的顺序。首先建立邻接表,然后统计每个定点的入度,对于入度没0的点首先输出,一共可以出现n个点,若其中没能找到入度没0的点,则图中存在环,现在给出一个可能的例子:

根据上面的示例,可以写出代码:

#include <iostream>#include <vector>#include <set>#include <stack>using namespace std;struct Edge{int u;int v;Edge( int uu=0,int vv=0){u = uu;v = vv;}};void topologicalSort(void){#define SIZE 6// 邻接表vector<vector<int>> con;vector<int> cnt;cnt.resize(SIZE,0); // 入度con.resize(SIZE);// 保持数组关系的vector<Edge> vec;vec.push_back(Edge(0,1));vec.push_back(Edge(0,3));vec.push_back(Edge(1,5));vec.push_back(Edge(2,1));vec.push_back(Edge(2,5));vec.push_back(Edge(4,5));vec.push_back(Edge(4,1));vec.push_back(Edge(4,0));for ( int i=0; i<vec.size(); ++i ){con[vec[i].u].push_back(vec[i].v);++cnt[vec[i].v];}int top = -1;// 建立入度栈for ( int i=0; i<SIZE; ++i){if ( cnt[i] == 0 ){cnt[i] = top;top = i;}}for ( int i=0; i<SIZE; ++i ){if ( top == -1 ) // 栈为空,有环return;int j = top;top = cnt[top];cout<<j<<" ";// 更新入度表for ( int k=0; k<con[j].size(); ++k ){if ( --cnt[con[j][k]] == 0 ){cnt[con[j][k]] = top;top = con[j][k];}}}cout<<endl;}int main(){topologicalSort();}

运行后输出的次序如下:

转载请标明出处,欢迎转载~

 

原创粉丝点击