问题与解答

问题描述

判断有向图中是否有环。

输入格式

输入数据第一行是一个正整数,表示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"); //拓扑排序失败:存在有向环
}

题后反思

  1. 判断有向图中是否有环: 拓扑排序

    • 拓扑排序易错点:两层判断是嵌套关系,否则会进入死循环!!!
    if(G[u][v] != 0){
    InDegree[v]--; //邻接点入度-1
    if(InDegree[v] == 0) //若入度变为0,入队
    q.push(v);
    }
  2. 写多点测试题时注意全局变量的初始化【fill(InDegree,InDegree+MaxN,0); //每次都要重置InDegree数组!】否则样例输出011

<数据结构>XDOJ323.判断有向图中是否有环的更多相关文章

  1. HDU3342:判断有向图中是否存在3元环-Tarjan或拓扑排序

    题目大意: 给你一个关系图,判断是否合法.每个人都有师父和徒弟,可以有很多个: 若A是B的师父,B是C的师父,则A也算C的师父. 不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟 ...

  2. Q:判断链表中是否存在环的相关问题

    问题:如何判断一个单向链表中是否存在环? 例如: 链表中存在环(B-->D): <-- <--^ | | v | A-->B-->C-->D 链表中不存在环: A- ...

  3. LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

    和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...

  4. hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序

    一:题目大意:   给你一个关系图,判断是否合法,    每个人都有师父和徒弟,可以有很多个:  不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的 ...

  5. 【C++】判断一个图是否有环 无向图 有向图(转载)

    没有找到原文出处,请参考一下链接: http://www.cnblogs.com/hiside/archive/2010/12/01/1893878.html http://topic.csdn.ne ...

  6. POJ 1860 Currency Exchange(如何Bellman-Ford算法判断图中是否存在正环)

    题目链接: https://cn.vjudge.net/problem/POJ-1860 Several currency exchange points are working in our cit ...

  7. 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现

    引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...

  8. Tree Operations 打印出有向图中的环

    题目: You are given a binary tree with unique integer values on each node. However, the child pointers ...

  9. Expm 10_1 带负权值边的有向图中的最短路径问题

    [问题描述] 对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环. package org.xiu68.exp.exp10; p ...

随机推荐

  1. 【STM32】使用DMA+SPI传输数据

    DMA(Direct Memory Access):直接存储器访问 一些简单的动作,例如复制或发送,就可以不透过CPU,从而减轻CPU负担 由于本人使用的是正点原子开发板,部分代码取自里面的范例 本篇 ...

  2. zabbix之修改中文

    #在zabbix服务器安装中文名包 root@ubuntu:~# sudo apt-get install language-pack-zh* #:修改环境变量 root@ubuntu:~# sudo ...

  3. 应用层协议——DHCP

    常见协议分层 网洛层协议:包括:IP协议.ICMP协议.ARP协议.RARP协议. 传输层协议:TCP协议.UDP协议. 应用层协议:FTP.Telnet.SMTP.HTTP.RIP.NFS.DNS ...

  4. OceanBase 2.x体验:推荐用DBeaver工具连接数据库

    Original MQ4096 [OceanBase技术闲谈](javascript:void(0) 2020-01-15 OceanBase 2.x体验:推荐用DBeaver工具连接数据库 Ocea ...

  5. LightningChart .NET v.10.2.1已经发布了!

    LightningChart .NET v.10.2.1已经发布了! 了解更多关于兼容性和优化方面的最新改进. 主要改进 我们很高兴地宣布LightningChart .NET产品系列的第三个主要版本 ...

  6. 自动化测试环境搭建之Python3.6+selenium44+firefox

    推荐使用: Python3.6+selenium2.53.6+Firefox46以下 +[Chrome任意版本+对应版本webdriver] ----------------------------- ...

  7. 4、BFS算法套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  8. GDAL重投影重采样像元配准对齐

    研究通常会涉及到多源数据,需要进行基于像元的运算,在此之前需要对数据进行地理配准.空间配准.重采样等操作.那么当不同来源,不同分辨率的数据重采样为同一空间分辨率之后,各个像元不一一对应,有偏移该怎么办 ...

  9. CF139A Petr and Book 题解

    Content 小 P 有一本 \(n\) 页的书,现给出他一周七天每天的阅读页数,求它在星期几读完这本书. 数据范围:\(1\leqslant n\leqslant 1000\). Solution ...

  10. 关于后端 Entity Model Domain 的分界线

    前言:在我们开发中经常用一种类型的值来接收来自Dao层的数据并将它传送给前端,或者作为逻辑处理,一般这种类型有三种 Entity  Model  Domain  我们该如何准确的应用这三种类型呢?这三 ...