拓扑排序 模板
2016-07-25 17:50
232 查看
/*注意初始化init(); *点从0开始计算; 读入数据的时候要-1;输出的时候要加1 * * */ int Ecnt = 0; int n,m; int const SIZE_E = //1000010; int const SIZE_V = //10010; struct edge_t{ int v; edge_t *next; }Edge[SIZE_E]; edge_t *V[SIZE_V]; int InDeg[SIZE_V]; inline void mkEdge(int a,int b){ Edge[Ecnt].v = b; Edge[Ecnt].next = V[a]; V[a] = Edge + Ecnt++; InDeg[b]++; } //存储排序的结果 int ansSort[SIZE_V]; int AScnt = 0; int topoSort(){ int ret = 0; AScnt = 0; priority_queue < int , vector<int>,greater<int> > q; for (int i = 0; i < n;++i) if (InDeg[i] == 0) q.push(i); while(!q.empty()){ int u = q.top(); ansSort[AScnt++] = u; q.pop(); ++ret; for (edge_t *p = V[u]; p ;p = p->next){ int v = p->v; InDeg[v]--; if (0 == InDeg[v]) q.push(v); } } return ret; } inline void init(){ Ecnt = 0; AScnt = 0; memset(V,0,sizeof(V)); memset(InDeg,0,sizeof(InDeg)); } //打印拓扑排序结果 void PrintAnsV(){ for (int i = 0;i < AScnt-1;++i) printf("%d ",ansSort[i]+1); printf("%d\n",ansSort[AScnt-1]+1); }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法