[算法] 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),名字非常高 ...
随机推荐
- PHP上传文件详解
1.上传文件使用的提交方式和请求Content-type POST提交方式,原始的form表单提交请加上enctype="multipart/form-data" 2.MAX_FI ...
- boost ASIO实例
client端代码 #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> ...
- URL的# (转)
http://www.ruanyifeng.com/blog/2011/03/url_hash.html
- 软件开发常用的linux命令心得(ubuntu为例)
软件开发过程中难免要经常对主机进行配置或者部署等操作,想到一些就写一些了,以后再更新 解压命令: a.如果是tar文件,则直接用 “tar zxvf 文件名”: b.如果是zip文件,用 “unzip ...
- acm课程练习2--1001
题目描述 Now,given the equation 8x^4 + 7x^3 + 2x^2 + 3x + 6 == Y,can you find its solution between 0 and ...
- java 实例变量和类变量的区别
Example4_10.java public class Example4_10 { public static void main(String args[]) { Lader.下底=100; / ...
- Map 根据value 排序
总是有特殊的需求 ,呵呵 ,一起看看Map 根据value 排序的一个例子吧,还用到了泛型 很不错 此文仅供自己记录笔记. /** * hashmap 根据值排序 */ public static & ...
- 学习笔记——观察者模式Observer
观察者模式,当事件发生时,调用相应观察者的方法进行“通知”.Subject中使用一个数据结构存储需要通知的观察者对象,执行Notify时,执行所有观察者的Update方法.
- Git学习 -- 搭建Git服务器
搭建环境 服务器端:CentOS 6.5 IP:192.168.101.129 客户端:CentOS 6.5 . Windows 服务器端: 创建repository版本库,例如/srv/test ...
- 转:Selenium2.0介绍——WebDriver两种驱动浏览器的方式.
如果之前熟悉Selenium RC,理解了Selenium RC是如何工作的,那么,当第一次接触Selenium WebDriver的时候,看到WebDriver居然可以不需要指定远端服务器的IP地址 ...