[算法] 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),名字非常高 ...
随机推荐
- Linux 查硬件配置
一:查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如 ...
- Linux系统的信号详解
一.信号类型 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) ...
- centos7与centos6区别
CentOS 7 vs CentOS 6的不同 (1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell)(2)文件系统[CentOS6] ...
- 得到root,并且获取密码
第一次使用ubuntu的时候 先使用这个命令 sudo passwd root 然后就可以改密码了
- iOS中的多线程基础
NSThread NSThread是一个苹果封装过的,面向对象的线程对象.但是它的生命周期需要我们自己来手动管理,所以使用不是很常见,比如[NSThread currentThread],它可以获取当 ...
- 【转】4G手机打电话为什么会断网 4G上网和通话不能并存原因分析
与2G/3G相比,4G最大的特色就是提供了超过100Mbps的峰值速率,既然速度都可以秒掉20M的光纤固网了,那用来语音通话不就更是小菜一碟了吗?很遗憾,问题就出现在了这里. 由于目前的LTE网络(4 ...
- Hibernate 系列教程2-创建maven工程
第1步:通过eclipse新建1个java maven项目. 选择file–>new–>other–>MAVEN PROJECT选项 第2步:New Maven project 选择 ...
- UVA 1193 区间相关(greedy)
input n d 1<=n<=1000 n行坐标xi,yi output 位于x轴扫描器的扫描距离为d,至少要多少个扫描器才能扫描到所有坐标 如果无法扫描完输出-1,否则输出扫描器个数 ...
- Python中元素定位探讨
以下以阿里云(10.10.1.11)系统中考试答题为例进行了python脚本的编写研究.模糊定位(定位一些动态值): ————————————————————————————————————————— ...
- 学习笔记——桥接模式Bridge
桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更. 在OperationInterface中就调用实现的方法imp.O ...