<数据结构>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 ...
随机推荐
- 转 Android Studio中Junit调试
转:https://blog.csdn.net/xanthus_li/article/details/54314189 在程序开发完成后,需要交给专业的调试人员进行相关的专业调试(白盒测试,黑盒测试, ...
- oracle 以SYSDBA远程连接数据库
在服务器用sysdba登陆 grant sysdba to system 然后在远程就可以sysdba登陆数据库了
- sql技巧(增册改查)
1 select * from wyl.t; 2 --将数据从t1导入t2 3 insert into t2(c1,c2) select c1,c2 from t1 where c1= xx and ...
- list通过比较器进行排序
Collections.sort(dataList,new Comparator<BaseTransitData>(){ public int compare(Bas ...
- Servlet(1):Servlet介绍
一. Servlet介绍 Servlet 是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生 ...
- Java Bean 与Spring Bean 的区别
什么是JavaBean: JavaBean是一种JAVA语言写的可重用组件.JavaBean符合一定规范写的Java类,是一种规范.它的方法命名,构造以及行为必须符合特定的要求: 1.所有属性 ...
- 使用Stream方式处理集合元素
package com.itheima.demo03.Stream;import java.util.ArrayList;import java.util.stream.Stream;/** * @a ...
- 【MySQL】亲测可用的教程筛选:安装与卸载
windows版本的 安装看这篇,非常详细:https://www.cnblogs.com/winton-nfs/p/11524007.html 彻底清除:https://www.pianshen.c ...
- shell脚本 监控网卡信息
一.简介 源码地址 日期:2018/6/22 介绍:显示实时输入输出流量 效果图: 二.使用 适用:centos6+ 语言:英文 注意:无 下载 wget https://raw.githubuser ...
- Linux进程操作
查看进程启动时间 ps -eo pid,lstart | grep PID 查看进程的运行多久 ps -eo pid,etime |grep PID 查看进程中启动了哪些线程 top -H -p pi ...