精华内容
下载资源
问答
  • 拓扑序列步骤: 1,找到一个入度为0的点作为拓扑序列的第一个点 2,把该点和该点所有的边从中删去 3,再在新的中选择一个入度为0的点作为拓扑系列的第二个点 …以此类推,如果在所有节点尚未删去时找不到...

    求拓扑序列步骤:

    1,找到一个入度为0的点作为拓扑序列的第一个点
    
    2,把该点和该点所有的边从图中删去
    
    3,再在新的图中选择一个入度为0的点作为拓扑系列的第二个点
    

    …以此类推,如果在所有节点尚未删去时找不到入度为0的点则说明剩余节点存在环路,不存在拓扑序列

    在这里插入图片描述
    A,3,1,2,4,5,6
    B,3,1,2,4,6,5
    C,3,1,4,2,5,6
    D,3,1,4,2,6,5
    答案:D

    展开全文
  • 有向图拓扑序列

    2021-04-27 20:33:44
    有向图拓扑序列 给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出 −1。 若一个由图中所有点构成的序列 A 满足:...
    1. 有向图的拓扑序列

    给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。

    请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。

    若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。

    输入格式
    第一行包含两个整数 n 和 m。

    接下来 m 行,每行包含两个整数 x 和 y,表示存在一条从点 x 到点 y 的有向边 (x,y)。

    输出格式
    共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。

    否则输出 −1。

    数据范围
    1≤n,m≤105
    输入样例:
    3 3
    1 2
    2 3
    1 3
    输出样例:
    1 2 3
    题目分析
    1.存在拓扑序列一定无环。
    2.邻接表存储图。

    void add(int a,int b)
    {
    	e[idx]=b;
    	ne[idx]=h[a];
    	h[a]=idx++;
    }
    
    

    3.储存每个节点的入度。

    4.把入度为0的节点入队列

    5.把该节点关联的节点的入度减一

    bool topsort()
    {
    	 queue<int>r;
    	for(int k=1;k<=a;k++)
    	{
    		if(d[k]==0)
    		r.push(k);
    	}
    	int t;
    	while(!r.empty())
    	{
    		t=r.front();
    		top[cnt]=t;
    		cnt++;
    		r.pop();
    		for(int k=h[t];k!=-1;k=ne[k])
    		{
    			int j=e[k];
    			d[j]--;
    			if(d[j]==0) r.push(j);
    		}
    	}
    	if(cnt<a-1) return 0;
    	else return 1;
    }
    

    代码如下

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int e[N],ne[N],h[N],idx,d[N],top[N],cnt;
    int a,b;
    void add(int a,int b)
    {
    	e[idx]=b;
    	ne[idx]=h[a];
    	h[a]=idx++;
    }
    
    bool topsort()
    {
    	 queue<int>r;
    	for(int k=1;k<=a;k++)
    	{
    		if(d[k]==0)
    		r.push(k);
    	}
    	int t;
    	while(!r.empty())
    	{
    		t=r.front();
    		top[cnt]=t;
    		cnt++;
    		r.pop();
    		for(int k=h[t];k!=-1;k=ne[k])
    		{
    			int j=e[k];
    			d[j]--;
    			if(d[j]==0) r.push(j);
    		}
    	}
    	if(cnt<a-1) return 0;
    	else return 1;
    }
    int main()
    {		
    	cin>>a>>b;
    	memset(h,-1,sizeof(h));
    	for(int k=1;k<=b;k++)
    	{
    		int c,e;
    		cin>>c>>e;
    		add(c,e);
    		d[e]++;
    	}
    	if(topsort()==0) cout<<"-1";//没有
    	else  //有  
    	{
    		for(int k=0;k<a;k++)
    		{
    			cout<<top[k]<<" ";
    		}
    	}
    	return 0;
    }
    


    百度百科:
    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

    展开全文
  • 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格式 第一行包含两个...

    1、题目描述

    给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。

    请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。

    若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。

    输入格式

    第一行包含两个整数n和m

    接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。

    输出格式

    共一行,如果存在拓扑序列,则输出拓扑序列。

    否则输出-1。

    数据范围

    1≤n,m≤1051≤n,m≤105

    输入样例:

    3 3
    1 2
    2 3
    1 3
    

    输出样例:

    1 2 3

     

    2、分析

    拓扑排序
    只适用于 AOV网 (有向无环图)

    算法流程:

    用队列来执行 ,初始化讲所有入度为0的顶点入队。

    主要由一下两步循环执行,直到不存在入度为 0 的顶点为止:

    选择一个入度为 0 的顶点,并将它输出;
    删除图中从顶点连出的所有边。
    循环结束,若输出的顶点数小于图中的顶点数,则表示该图存在回路,即无法拓扑排序;否则,输出的就是拓扑序列 (不唯一)

     

    3、代码

    import java.util.*;
    import java.io.*;
    
    public class Main{
        static int N = 100010;
        static int[] queue = new int[N];
        static int[] h = new int[N];
        static int[] e = new int[N];
        static int[] ne = new int[N];
        static int idx;
        static int[] rd = new int[N];
        static int n;
        
        static void store(int a, int b) {
            e[idx] = b;
            ne[idx] = h[a];
            h[a] = idx ++;
        }
        
        static boolean topSort() {
            int hh = 0, tt = -1;
            
            //将入度为0点加入到队列
            for(int i = 1;i <= n;i ++) {
                if(rd[i] == 0) {
                    queue[++ tt] = i;
                }
            }
            
            while(hh <= tt) { //队列不空
                int u = queue[hh ++];
                
                for(int i = h[u];i != -1;i = ne[i]) {
                    int j = e[i]; //找到u的一条出边 u->j
                    rd[j] --; //删除这条出边
                    if(rd[j] == 0) {
                        queue[++ tt] = j;
                    }
                }
            }
            return tt == n-1;
        }
        
        public static void main(String[] args) {
            Scanner in = new Scanner(new InputStreamReader(System.in));
            n = in.nextInt();
            int m = in.nextInt();
            
            for(int i = 0;i < N;i ++) {
                h[i] = -1;
            }
            
            for(int i = 0;i < m;i ++) {
                int a = in.nextInt();
                int b = in.nextInt();
                store(a, b);
                rd[b] ++; //入度加1
            }
            
            //宽度优先搜索
            if(topSort()) {
                for(int i = 0;i < n;i ++) {
                    System.out.print(queue[i] + " ");
                }
            }else {
                System.out.println("-1");
            }
            
        }
        
    }

     

    展开全文
  • 拓扑排序一、有向图拓扑序列二、代码实现 一、有向图拓扑序列 给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若...


    一、有向图的拓扑序列

    给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。

    请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。

    若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。

    二、代码实现

    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 100010;
    
    int n, m;
    int h[N], e[N], ne[N], idx;
    int d[N];
    int q[N];
    
    void add(int a, int b)
    {
        e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
    }
    
    bool topsort()
    {
        int hh = 0, tt = -1;
    
        for (int i = 1; i <= n; i ++ )
            if (!d[i])
                q[ ++ tt] = i;
    
        while (hh <= tt)
        {
            int t = q[hh ++ ];
    
            for (int i = h[t]; i != -1; i = ne[i])
            {
                int j = e[i];
                if (-- d[j] == 0)
                    q[ ++ tt] = j;
            }
        }
    
        return tt == n - 1;
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
    
        memset(h, -1, sizeof h);
    
        for (int i = 0; i < m; i ++ )
        {
            int a, b;
            scanf("%d%d", &a, &b);
            add(a, b);
    
            d[b] ++ ;
        }
    
        if (!topsort()) puts("-1");
        else
        {
            for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);
            puts("");
        }
    
        return 0;
    }
    

    展开全文
  • BFS - 有向图拓扑序列 给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中...
  • [code="c"] #include "stdio.h" #include "stdlib.h" #define MAXNUM 100 .../*输入有向图的数据,输出该有向图拓扑序列 test data 5 4 0 4 2 4 3 3 1 0 3 2 0 2 3...
  • 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格式 第一行包含两个整数...
  • 拓扑排序:有向无环图(拓扑图) 拓扑序列是顶点活动网中将活动按发生的先后次序进行的一种排列 前提: 有向无环图→\rightarrow→ ...有向图拓扑序列:https://www.acwing.com/problem/content/850/ #include<
  • 有向图拓扑序列 描述 问题转化为:给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A...
  • AcWing - 有向图拓扑序列(拓扑排序)

    千次阅读 2019-08-16 08:17:39
    请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格...
  • 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格式 第一行包含两个整数...
  • 题目:AcWing848 有向图拓扑序列 题解目录前言一、题目陈述二、解决思路三、代码实现总结 前言 BFS搜索图的应用除了求最短路,还有求拓扑序列。可以证明,一个有向无环图一定存在一个拓扑序列,所以说有向无环图...
  • 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格式 第一行包含两个整数...
  • 有向图拓扑序列-bfs的应用题目题目分析变量说明源代码备注说明 题目 给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1...
  • 采用回溯法求解有向图DAG的所有拓扑序列
  • 一个有向图具有拓扑序列,那么他的邻接矩阵必为(D) A.对称矩阵 B.系数矩阵 C.三角矩阵 D.一般矩阵 一个有向图具有有序拓扑序列,那么他的邻接矩阵必为(C) A.对称矩阵 B.系数矩阵 C.三角矩阵 D.一般矩阵 ...
  • 有向图才会有拓扑序列 起点都在终点前面 环是找不到任何点入队的 一个有向无环图一定至少存在一个入度为0的点 给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。 请输出任意一个该有向图拓扑...
  • 请输出任意一个该有向图拓扑序列,如果拓扑序列不存在,则输出-1。 若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。 输入格式 第一行包含两个...
  • #include <iostream> #include <stack> using namespace std; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; } ArcNode; typedef struct VNode { int data;... .
  • 只有有向图才有拓扑序,当有向图存在拓扑序且按照拓扑序排好之后,直观来讲它的拓扑序列点边指向都是从前指向后的,即拓扑序列中的每条边,起点都在终点的前面。 只要有环,就不存在拓扑序。可证明,一个有向无环图...
  • 拓扑序列

    2020-11-03 19:49:31
    拓扑序列都是针对有向图而言的 将图中的节点按拓扑序列排好后,所有的边都是从前指向后的,没有反向边 只要存在环,则一定没有拓扑序列 一个有向无环图一定存在一个拓扑序列(有向无环图也叫拓扑图) 所有入度为0的...
  • 拓扑序列是对有向无环的节点编号的排序使得满足任意一条边的起点都在终点的前面,例如: 1—>2, 3—>2 的有向无环的一个拓扑序列为1,3,2。 任何一个有向无环都至少有一个拓扑序列。因此有向无环也被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,478
精华内容 10,591
关键字:

有向图的拓扑序列