<数据结构>XDOJ323.判断有向图中是否有环
问题与解答
问题描述
判断有向图中是否有环。
输入格式
输入数据第一行是一个正整数,表示n个有向图,其余数据分成n组,每组第一个为一个整数,表示图中的顶点个数n,顶点数不超过100,之后为有向图的邻接矩阵。
输出格式
输出结果为一行,如果有环,则输出1,如果无环,则输出0。按顺序输出这n个有向图的判断结果,前后结果的输出不加空格。
样例输入
3
2
0 1
0 0
4
0 1 0 0
0 0 0 1
0 0 0 1
1 0 0 0
3
0 1 1
0 0 0
0 0 0
样例输出
010
//判断有向图中是否有环
//本质:拓扑排序
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
#define MaxN 100 //最大顶点数
int n; //顶点数
int G[MaxN][MaxN]; //邻接矩阵保存图
int InDegree[MaxN] = {0}; //保存顶点入度
void TopoSort(); //拓扑排序判断有向环
int main(){
int num, i, j, flag;
scanf("%d", &num);
while(num--){ //多点输入:执行num次
scanf("%d", &n);
fill(InDegree,InDegree+MaxN,0); //每次都要重置InDegree数组!
for(i = 0; i < n; i++){ //输入图的邻接矩阵
for(j = 0; j < n; j++){
scanf("%d", &flag);
G[i][j] = flag;
if(flag != 0)
InDegree[j]++;
}
}
TopoSort(); //拓扑排序
}
}
void TopoSort(){
queue<int> q;
int u,v;
int node = 0;
for(u = 0; u < n; u++){ //将入度为0的顶点入队
if(InDegree[u] == 0){
q.push(u);
}
}
while(!q.empty()){ //若队列非空
u = q.front();
q.pop(); //u出队
for(v = 0; v < n; v ++){ //扫描u的邻接点
if(G[u][v] != 0){
InDegree[v]--; //邻接点入度-1
if(InDegree[v] == 0) //若入度变为0,入队
q.push(v);
}
}
node++; //已完成拓扑排序的顶点数目+1
}
if(node == n) printf("0"); //拓扑排序成功:无有向环
else printf("1"); //拓扑排序失败:存在有向环
}
题后反思
- 判断有向图中是否有环: 拓扑排序
- 拓扑排序易错点:两层判断是嵌套关系,否则会进入死循环!!!
if(G[u][v] != 0){
InDegree[v]--; //邻接点入度-1
if(InDegree[v] == 0) //若入度变为0,入队
q.push(v);
}
- 写多点测试题时注意全局变量的初始化【
fill(InDegree,InDegree+MaxN,0); //每次都要重置InDegree数组!】否则样例输出011
<数据结构>XDOJ323.判断有向图中是否有环的更多相关文章
- HDU3342:判断有向图中是否存在3元环-Tarjan或拓扑排序
题目大意: 给你一个关系图,判断是否合法.每个人都有师父和徒弟,可以有很多个: 若A是B的师父,B是C的师父,则A也算C的师父. 不合法: 1) . 互为师徒:(有回路) 2) .你的师父是你徒弟 ...
- Q:判断链表中是否存在环的相关问题
问题:如何判断一个单向链表中是否存在环? 例如: 链表中存在环(B-->D): <-- <--^ | | v | A-->B-->C-->D 链表中不存在环: A- ...
- LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...
- hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序
一:题目大意: 给你一个关系图,判断是否合法, 每个人都有师父和徒弟,可以有很多个: 不合法: 1) . 互为师徒:(有回路) 2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的 ...
- 【C++】判断一个图是否有环 无向图 有向图(转载)
没有找到原文出处,请参考一下链接: http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.html http://topic.csdn.ne ...
- POJ 1860 Currency Exchange(如何Bellman-Ford算法判断图中是否存在正环)
题目链接: https://cn.vjudge.net/problem/POJ-1860 Several currency exchange points are working in our cit ...
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...
- Tree Operations 打印出有向图中的环
题目: You are given a binary tree with unique integer values on each node. However, the child pointers ...
- Expm 10_1 带负权值边的有向图中的最短路径问题
[问题描述] 对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环. package org.xiu68.exp.exp10; p ...
随机推荐
- Java【常用的日期操作】
目录 1.设置时间 2.获取年月日时分秒 3.通过运算获取时间 4.和Date类转换 5.格式化时间 6.新功能LocalDate:当前日期格式化 7.示例 java.util.Calendar 类是 ...
- ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in..的错误 [转]
问题: ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in..的错误 解决方法: 把没被singed的变量临时变更signed去处 ...
- C语言把数字转换为字符串的函数
博主原文 C语言itoa()函数和atoi()函数详解(整数转字符C实现) C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. 1.int/float to st ...
- android Paint 详解
/** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体 ...
- ES安装简记
JDK # java -versionjava version "1.8.0_231"Java(TM) SE Runtime Environment (build 1.8.0_23 ...
- Vue.js 学习
一,Vue.js 介绍 Vue 是一套用于构建用户界面的渐进式javascript框架,与其它大型框架不同的是:Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,不仅易于上手,还便于与第 ...
- 【编程思想】【设计模式】【结构模式Structural】门面模式/外观模式Facade
Python版 https://github.com/faif/python-patterns/blob/master/structural/facade.py #!/usr/bin/env pyth ...
- 【Java 与数据库】JDBC中日期时间的处理技巧
JDBC中日期时间的处理技巧 详谈Java.util.Date和Java.sql.Date 基础知识 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒 ...
- mybtis入门
1.编写持久化对象 public class User { private String id;//用户编号 private String username;//用户名 private String ...
- Jenkins配置代码化
目录 一.简介 二.init.groovy 脚本命令行调试 一.简介 Jenkins用久了,会有一种莫名的紧张感.因为没人清楚Jenkins都配置了什么,以至于没人敢动它. 但凡使用界面进行配置的都会 ...