图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的

又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可

例:

u(边的起点) v(边的终点) w(边的权值)
4 2 1
1 2 3
1 4 1
1 5 2
4 3 4
2 3 1

话不多说,直接上代码

for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u1,&v1,&w1);
        e[i].u =u1;//赋给第i条边的起点
        e[i].v =v1;//赋给第i条边的终点
        e[i].w =w1;//赋给第i条边的权值
        e[i].next =head[u1];//现在这条边的上一条边=现在这条边的起点的上一条边(u1是起点)
   head[u1]=i;//于是,对于以后的边来说,现在这条边就是起点的上一条边 }

注:e[i]为一个结构体,负责记录每一条边的信息

struct Node{
    int u;//边的起点
        int v;//边的终点
        int w;//边的权值
    int next;//边的上一条边(用于连接)
}e[边的最大条数];    

总的来说,这是一种存图的方法,更是图论的基础

拓扑排序

拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)求出一个顶点序列,使其满足:对于任意边(u,v)?E,u在序列的位置总在v之前。

 拓扑排序实现方法如下:

  (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.//入度:到这个点的边有多少条

  (2)从图中删去该顶点,并且删去从该顶点发出的全部有向边,并且更新点的入度.

  (3)重复上述两步,直到剩余的图中不再存在没有前趋的顶点为止.

使用方法:1、邻接矩阵+直接法。(空间开销大,不能判断有环)

2、邻接链表+栈(空间小,可以判断环)

所以,一般用来实现

bool topsort()//拓扑排序,有拓扑序返回真,否则返回假
{
    int p,q;
    for(int i=1;i<=n;i++)//先找到入度为0的节点入栈
    {
        if(!d[i])s.push(i);//d[i]表示i点的入度,在加边的时候初始化d[i]
    }
    while(!s.empty())//当栈非空进行操作
    {
        p=s.top();//记录栈顶节点
        s.pop();//弹出栈顶节点
        ans[cnt++]=p;//将弹出节点存储到结果数组,并计数
        for(int i=head[p];i!=-1;i=e[i].next)//清除该节点的出度
        {
            q=e[i].v;
            if(!(--d[q]))s.push(q);//如果又发现入度为0的节点,继续入栈
        }
    }
    if(cnt<=n)return false;//当有节点没入栈,则说明存在环
    return true;
}

另外在需要最大和最小拓扑序时,就要用到优先队列来存入

代码主体差不多,只是优先队列定义与栈不同罢了

原文地址:https://www.cnblogs.com/jhl0824/p/11618429.html

时间: 2024-10-10 00:57:33

图论基础——邻接链表存图+拓扑排序的相关文章

HDU 4857 逃生(拓扑排序逆向+邻接表存图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题目: Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处. 负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,

ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TshingHua OJ-旅行商TSP)

做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(TSP) Description Shrek is a postman working in the mountain, whose routine work is sending mail to n villages. Unfortunately, road between villages is

HDU4857——逃生(反向建图+拓扑排序)

逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处.负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推.那么你就要安排大家的顺序.我们保证一

数据结构:图--拓扑排序

拓扑排序 拓扑排序 在实际应用中,有向图的边可以看做是顶点之间制约关系的描述.把顶点看作是一个个任务,则对于有向边<Vi,Vj>表明任务Vj的完成需等到任务Vi完成之后,也就是说任务Vi先于任务Vj完成.对于一个有向图,找出一个顶点序列,且序列满足:若顶点Vi和Vj之间有一条边<Vi,Vj>,则在此序列中顶点Vi必在顶点Vj之前.这样的一个序列就称为有向图的拓扑序列(topological order). 步骤 从有向图中选取一个没有前驱(入度为0)的顶点输出. 删除图中所有以它为

生化危机 邻接表存图+BFS

生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室. 恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天

CSU 1804: 有向无环图 拓扑排序 图论

1804: 有向无环图 Submit Page   Summary   Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 716     Solved: 298 Description Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,-,n 编号. 设 count(x,y) 表示点 x 到点 y 不同的路径数量(规定 count(x,x)=0

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

图-&gt;有向无环图-&gt;拓扑排序

文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph).DAG图是一类较有向树更一般的特殊有向图. 举个例子说明有向无环图的应用.假如有一个表达式: ((a+b)*(b*(c+d))+(c+d)*e)*((c+d)*e), 可以用之前讨论的二叉树来表示,也可以用有向无环图来表示,如下图.显然有向无环图实现了对相同子式的共享,从而比二叉树更节省空间. 关于拓扑排序的基础定义: 由某个集合上的一个偏序得到该集合上的一个全须

图论知识整理(2) 拓扑排序、最短路、最小生成树

===================================== 发现以前图论学的很不好,什么都不会,现在开始整理图论知识了 作者就是个蒟蒻,ORZ各位大神们 ===================================== 定义:对一个有向无环图(Directed Acyclic Graph,简称DAG)进行拓扑排序,将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. 说的好像很有道理,然而我并没有看懂它在