[算法] aov图拓扑算法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue> using namespace std; #define MAX 100 struct Node{
int value;
struct Node* nextNode;
}; struct LGraph{
struct Node vertexs[MAX];
int ids[MAX];
int vexnum;
int edgenum;
} lg; void create_lg(){
int u,v;
int i;
struct Node *pi;
for(i = 0; i < lg.edgenum; i++){
scanf("%d%d", &u, &v);
u --; v --;
pi = (struct Node*)malloc(sizeof(struct Node));
pi->value = v;
pi->nextNode = lg.vertexs[u].nextNode;
lg.vertexs[u].nextNode = pi;
lg.ids[v] ++;
}
} void sort() {
int i;
int index = 0;
int count[MAX];
memset(count, 0, sizeof(count));
queue<int> Q;
for(i = 0; i < lg.vexnum; i++){
if(0 == lg.ids[i]){
Q.push(i);
}
}
while(!Q.empty()){
int node;
struct Node * pi;
struct Node * tmp;
node = Q.front();
count[index++] = node;
Q.pop();
pi = lg.vertexs[node].nextNode;
while(pi){
int v = pi->value;
lg.ids[v] --;
if(lg.ids[v] == 0) {
Q.push(v);
}
tmp = pi;
pi = pi->nextNode;
free(tmp);
lg.edgenum --;
}
}
if(index == lg.vexnum){
for(i = 0; i < index; i++){
if(i == 0){
printf("%d", count[i] + 1);
}
else{
printf(" %d", count[i] + 1);
}
}
printf("\n");
}
else{
printf("Network has a cycle!\n");
} } void delete_lg(){
int i;
struct Node * pi;
for( i = 0; i < lg.vexnum; i++){
pi = lg.vertexs[i].nextNode;
while(pi) {
pi = pi->nextNode;
free(pi);
}
}
} void init_lg(){
lg.vexnum = 0;
lg.edgenum = 0;
memset(lg.vertexs, 0, sizeof(lg.vertexs));
memset(lg.ids, 0, sizeof(lg.ids));
delete_lg();
} int N, M; int main() {
int i; while(1) {
scanf("%d%d", &N, &M);
if( 0 == N && 0 == M) {
break;
}
init_lg();
lg.vexnum = N;
lg.edgenum = M;
create_lg();
sort();
}
init_lg();
return 0;
}
假设输入文件中有向图的格式为:首先是顶点个数 n 和边数 m;然后是每条边,每条边的数
据占一行,格式为 u v,表示从顶点 u 到顶点 v 的一条有向边,顶点序号从 1 开始计起。输入文件
最后一行为 0 0,表示输入数据结束。
样例输入:
6 8
1 2
1 4
2 6
3 2
3 6
5 1
5 2
5 6
6 8
1 3
1 2
2 5
3 4
4 2
4 6
5 4
5 6
0 0
样例输出:
3 5 1 4 2 6
Network has a cycle!
[算法] aov图拓扑算法的更多相关文章
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- 算法:图(Graph)的遍历、最小生成树和拓扑排序
背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...
- 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort
概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...
- java数据结构_笔记(5)_图的算法
图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献.不足之处请大家指正. 这是博主近期看到的效果最好,实现最简单 ...
- 基于GraphCuts图割算法的图像分割----OpenCV代码与实现
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 1.绪论 图切割算法是组合图论 ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- Geeks Union-Find Algorithm Union By Rank and Path Compression 图环算法
相同是查找一个图是否有环的算法,可是这个算法非常牛逼,构造树的时候能够达到O(lgn)时间效率.n代表顶点数 原因是依据须要缩减了树的高度,也叫压缩路径(Path compression),名字非常高 ...
随机推荐
- MySQL 出现 The table is full 的解决方法【转】
[MySQL FAQ]系列 — 你所不知的table is full那些事 时间 2014-08-21 12:18:56 MySQL中文网 原文 http://imysql.com/2014/08 ...
- PHP fpm优化【转】
在优化PHP的进程数的时候我们首先要了解我们服务器执行一个php使用的内存 1: 查询一个php占用的内存方法 pmap $(pgrep php-fpm | head -1) 我这里查询到的是 000 ...
- RGB888转RGB666
内存中的数据排列高位在左,低位在右 RGB888->RGB666 高 -------低 B[3] B[2] B[1] B[0] ...
- byte数组转16进制 输出到文件
try { File file = new File(Environment.getExternalStorageDirectory(),"shuju2"); if(!file.e ...
- win8上cmder文字重叠问题
1.用过ubuntu上的bash,zsh后发现win自带的cmd弱爆了,在网上搜索后找到了代替品cmder,下载安装后好发现中文错位的问题, 状况如下: 修复方法:把设置里面的Monospace选项勾 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- shell注意事项
以下基于bash 1.shell只有变量和数组?,数组() 2.( (表达式1,表达式2…) ) 3.[ expr ] 实际上是bash 中 test 命令的简写.即所有的 [ expr ] 等于 t ...
- Android 使用存放在存assets文件夹下的SQLite数据库
因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面.一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机 ...
- 转载 Deep learning:三(Multivariance Linear Regression练习)
前言: 本文主要是来练习多变量线性回归问题(其实本文也就3个变量),参考资料见网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage. ...
- ajax遇到的问题
今天做了个小小的实验,用ajax XMLHttpRequest对象读取服务器上的txt文件里的内容,展示出来 直接把html文件放在桌面用浏览器打开,没有反应,部分代码如下: function oHt ...