4084:拓扑排序

题目链接:http://bailian.openjudge.cn/practice/4084/

总时间限制: 1000ms 内存限制: 65536kB
描述

给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前。

输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号。
v<=100, a<=500
输出
若干个空格隔开的顶点构成的序列(用小写字母)。
样例输入
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5
样例输出
v1 v3 v2 v6 v4 v5

这道题可以考虑使用优先队列。下面的代码偷懒,直接使用最简单粗暴的方法:

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 #define maxN 1000
 9 #define maxM 2000
10 
11 struct NODE
12 {
13     int from; //边的起点
14     int to; //边的终点
15 };
16 struct NODE edge[maxM]; //边数组
17 int head[maxN]; //存储出发点为 Vi 的第一条边在 edge[ ]中的位置,一般初始化为-1。
18 
19 int n,m;//n个点m条边的图
20 int indegree[maxN];
21 int ttt;
22 
23 bool cmp(NODE a,NODE b)
24 {
25     if(a.from==b.from)return a.to<b.to;
26     return a.from<b.from;
27 }
28 void topo_sort();//利用队列完成无前驱节点优先的拓扑排序. 编号小的节点优先输出.
29 int main(int argc, char *argv[])
30 {
31     int i;
32 
33 
34     scanf("%d%d",&n,&m);
35     for(i=0;i<m;i++) cin>>edge[i].from>>edge[i].to;
36     sort(edge,edge+m,cmp);
37     //for(i=0;i<m;i++) printf("%d %d\n",edge[i].from,edge[i].to);//测试代码
38     memset(head,-1,sizeof(head));
39     head[edge[0].from]=0;
40     indegree[edge[0].to]=1;
41     for(i=1;i<m;i++)
42     {
43         if(edge[i].from != edge[i-1].from)
44         {
45             head[edge[i].from]=i;//标记以第 i 个点做起点的第一条边在 edge[]的位置
46         }
47         indegree[edge[i].to]++;//记录各个顶点的入度
48     }
49     //for(i=1;i<=n;i++) printf("%d ",indegree[i]);  printf("\n"); //测试代码:输出各个点的入度.(题目数据顶点编号从1开始)
50 
51     topo_sort();
52 
53     return 0;
54 }
55 
56 void topo_sort()//利用队列完成无前驱节点优先的拓扑排序. 编号小的节点优先输出.
57 {
58     int i,k;
59     ttt=n;
60     while(ttt>0)
61     {
62         for(i=1;i<=n;i++)//扫描寻找编号最小的无前驱节点
63         {
64             if(indegree[i]==0)
65             {
66                 printf("v%d ",i);
67                 ttt--;
68                 if(head[i]!=-1)//该顶点有邻接点
69                 {
70                     //遍历该顶点出发的全部有向边,把这些边的终点的入度减1.
71                     for(k=head[i];edge[k].from==i&&k<m;k++)
72                     {
73                         indegree[edge[k].to]--;
74                     }
75                     head[i]=-1;//删除该顶点出发的全部有向边
76                 }
77                 indegree[i]=-1;
78                 break;
79             }
80         }
81     }
82 }

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/9291886.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

廖雪峰git教程学习

廖雪峰git教程 git – Linus在2周内用c写的 1.1 基本概念 版本控制系统&#xff0c;追踪文本文件的改动&#xff0c;文件、视频等二进制文件则不可追踪&#xff08;微软的word也是二进制文件&#xff09;HEAD 指向当前分支&#xff0c;表示当前版本&#xff08;最新的提交&am…

操作系统 --- 进程和管程的不同

1.进程定义的是私有数据结构PCB,管程定义的是公共数据结构,如消息队列等; 2.进程是由顺序程序执行有关操作,而管程主要是进行同步操作和初始化操作; 3.设置进程的目的在于实现系统的并发行,而管程的设置则是解决共享资源的互斥使用问题; 4.进程通过调用管程中的过程对共享数据结…

JCO 自定义DestinationDataProvider

要让JAVA程序能访问SAP系统&#xff0c;一般通过SAP JCO接口进行通讯&#xff0c;在获取到SAP的连接时需求提供一些连接参数&#xff0c;这些参数在最新的 JCO 3.0 中需要被保存到一个带有扩展名.jcoDestination的文件中&#xff0c;这个文件同时被保存在应用程序的安装目录中。…

android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

android 从4.3系统开始可以连接BLE设备&#xff0c;这个大家都知道了。iOS是从7.0版本开始支持BLE。android 进入5.0时代时&#xff0c;开放了一个新功能&#xff0c;手机可以模拟设备发出BLE广播&#xff0c; 这个新功能其实是 对标于 iOS系统的手机模拟iBeacon设备。先介绍一…

前端后台管理系统梳理

再梳理一遍 一、商品后台管理系统 1. 功能 1.1 服务端情况 开启了CORS跨域支持需要授权的 API &#xff0c;必须在请求头中使用 Authorization 字段提供token 令牌&#xff08;axios拦截器&#xff09;baseUrl&#xff0c;接口地址&#xff1a;http://localhost:8888/api/…

操作系统 --- 使用套接字进行网络通信

一个套接字就是一个通信标识类型的数据结构,包含了通信目的的地址、通信使用的端口号、通信网络的传输协议、进程所在的网络地址,以及针对客户或服务器程序提供的不同系统调用等,是进程通信和网络通信的基本构件。套接字是为客户/服务器模型而设计的,通常分为以下两类: 1.基于…

构造器执行顺序

转载于:https://www.cnblogs.com/a6948076/p/8045801.html

Java08-java语法基础(七)构造方法

Java08-java语法基础&#xff08;七&#xff09;构造方法 一、构造方法 1、什么是构造方法&#xff1f; 构造方法&#xff08;类方法&#xff09;是一个方法名和类名相容的特殊的成员方法。 2、构造方法的作用&#xff1f; 当使用new关键字创建一个对象时&#xff0c;为新建对象…

安装mysql8.0.20,报错“找不到VCRUNTIME140_1.dll”

写在最前&#xff0c;指令集合 以管理员身份运行cmd mysql -uroot -p 【进入】mysql mysql > exit 【退出】 net stop mysql 【暂停】 net start mysql 【启动】 mysql -u root -p&#xff08;命令后输入临时密码&#xff0c;进入mysql&#xff09; ALTER USER USER() …

操作系统 --- 线程与进程的比较

如果说,在操作系统中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS(操作系统)具有更好的并发性… 我们再回顾一下进程的两个基本属性: 1.进程是一个可拥拥有资源的独…

24种吸引人的营销文章标题写法,总有一个适合你!

在如今信息爆炸的互联网时代下&#xff0c;如何提高提高文章的阅读(新闻稿、软文宣传稿、微信公众号)&#xff0c;成为从业者们共同研究的课题?首先你得有一个足够吸引的标题&#xff0c;尤其是定向推送的时候&#xff0c;这将是由一个质变带来量变的过程。小编虽然不提倡标题…

[js] 处理字符串换行造成的json解析失败

需求&#xff1a;从数据库某个字段取出字符串出来&#xff0c;转为json&#xff0c;结果发现报错为 解析失败&#xff0c;发现是因为取出的字符串换行导致&#xff0c;现在需要将字符串里面的换行替换为&#xff0c;使字符串可依成功解析成json对象。 技术&#xff1a;依靠repl…

使用mockjs模拟数据

一、安装 简单粗暴 npm install mockjs 二、引入 CommonJS引入 let Mock require(mockjs) let userInfo Mock.mock({data: {responseCode: 200,responseMessage: success,userMessage: {name: "cname",email: "email",msg: cparagraph(2)}} })或者ES…

angular --- ngDialog关闭当前层

今天做项目,使用ngDialog 弹出了一层,并且在弹出层上又弹出了第二层. 现在想点击确定按钮关闭第二层. 使用以前的ngDialog.close()会关闭掉全部ngDialog.open方法弹出来的层. 在网上查了一堆,找了好多,最后发现就一句话.$scope.closeThisDialog(); 注意, 要在controller:中传递…

lodash源码分析之compact中的遍历

小时候&#xff0c; 乡愁是一枚小小的邮票&#xff0c; 我在这头&#xff0c; 母亲在那头。 长大后&#xff0c;乡愁是一张窄窄的船票&#xff0c; 我在这头&#xff0c; 新娘在那头。 后来啊&#xff0c; 乡愁是一方矮矮的坟墓&#xff0c; 我在外头&#xff0c; 母亲在里头。…

[HAOI2008]移动玩具

这又是一道神奇的搜索题。。。只要记录每种状态。。。然后暴力判断这种状态往后一步的情况。。。 广搜出最优解即可。。。 呆码&#xff1a; #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std;int dx[5]{0…

javascript --- Sortable一个拖拽的接口

最近项目里面要实现需要实现一个拖拽功能,自己实现很麻烦,就在网上找到了一个封装好的sortable函数,github(https://github.com/SortableJS/Sortable). 首先是依赖的引入:(也可以自己下载源代码导入,方式很多呢) <body><!-- Latest compiled and minified CSS -->…

个人发展战略6天课

第一课 冰山模型 【知道自己为什么会不喜欢一份工作】 衡量和一个岗位是否匹配、匹配程度如何 从上到下的要素 知识技能&#xff08;30%&#xff09;特定领域 - 可以后天学习的&#xff0c;显性的、容易看出来的 和工作的关系&#xff1a; 工作中有陌生的内容&#xff0c;每天…

《Web全栈工程师的自我修养》

1. 什么是全栈工程师 Full-Stack Engineer Facaebook只招全栈工程师&#xff1f; Web开发流程 产品经理-->交互设计-->视觉设计-->开发&#xff08;前端、后端&#xff09;-->测试-->发布 流水线的优势 “各司其职”的弊端 工程师职责不清导致效率低工程师缺乏主…

div设置overflow-scroll滚动之后,jq获取其子元素的offset.top出现问题。

先上个图&#xff1a; 布局很简单&#xff0c;左右超过屏幕的部分自行滚动。 1. html <div class"ce-container"><div class"ce-leftBox">//左边的内容</div><div class"ce-rightBox">//右边的内容 </div…