图论
来源:互联网 发布:德州金蝶软件 编辑:程序博客网 时间: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();}
运行后输出的次序如下:
转载请标明出处,欢迎转载~
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论
- 图论~~!!!
- 图论
- 图论
- 图论
- 图论
- 图论
- 教你如何HTML显示一张图片的一部分
- JSP代码小实例
- 语法:MySQL中INSERT INTO SELECT的使用
- Android使用笔记--艰难的减肥过程
- sqlserver 逻辑执行步骤分析
- 图论
- java的输入语句小结
- 阿里巴巴笔试的一道综合题(关于计算机网络)
- 【破解小札记】--call、retn 和 retf
- phpdocumentor2 简介安装使用详解
- 一个简单的php批量上传程序
- Hibernate4新特性
- #pragma pack() effect
- 随机数生成问题