hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序
题目大意:
给你一个关系图,判断是否合法。每个人都有师父和徒弟,可以有很多个;
若A是B的师父,B是C的师父,则A也算C的师父。
不合法:
1) . 互为师徒;(有回路)
2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的师父。(出现回路)
思路:
判断有向图中是否存在回路或至少3元环;
此题至少有三种做法,此处更新拓扑排序的做法:
解题方法:
一:拓扑排序:
1) . 统计每个点的入度;
2) . 将入度为0的点加入队列;
3) . 出去队首元素,将此元素所连接的点入度减一,若此后入度为0则加入队列;
4) . 判断队列循环次数,若等于n则不存在3元环,则此关系图合法;
题目链接:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<stack>
#include<vector>
#include<ctime>
using namespace std;
const int N = ;
const int M = ;
int n,m;
int tot,flag;
int in[N],head[N];
struct lp
{
int u,v,nex;
lp(){}
lp(int a,int b,int c):
u(a),v(b),nex(c){}
}cw[N];
void add(int a,int b){
cw[++tot]=lp(a,b,head[a]);
head[a]=tot;
}
void tuopu(){
queue<int>Q;
while(!Q.empty())Q.pop();
for(int i=;i<n;++i){
if(in[i]==)Q.push(i);
}
int t=;
while(!Q.empty()){
t++;
int u=Q.front();Q.pop();
for(int i=head[u];i!=-;i=cw[i].nex){
int v=cw[i].v;
in[v]--;
if(in[v]==)Q.push(v);
}
}
if(t==n)flag=;
}
int main(int argc, char const *argv[])
{
int a,b;
while(~scanf("%d%d",&n,&m)&&(n)){
memset(in,,sizeof(in));
tot=-;
memset(head,-,sizeof(head));
for(int i=;i<m;++i){
scanf("%d%d",&a,&b);
add(a,b);
in[b]++;
}
flag=;
tuopu();
if(flag)printf("YES\n");
else printf("NO\n");
}
return ;
}
二:Tarjan:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<stack>
#include<vector>
#include<ctime>
using namespace std;
const int N = ;
const int M = ;
int n,tot,flag,idex;
int head[N],vis[N];
int low[N],dfn[N];
int qltNum;
int qltMap[N];
stack<int>st;
struct lp{
int to,nex;
lp(){}//构造函数
lp(int a,int b):
to(a),nex(b){}
}cw[N*N];
void add(int a,int b){
cw[++tot]=lp(b,head[a]);
head[a]=tot;
}
void dfs(int u,int fa){
dfn[u]=low[u]=++idex;
vis[u]=;
st.push(u);
int v;
for(int i=head[u];i!=-;i=cw[i].nex){
v=cw[i].to;
if(v==fa){
flag=;
break;
}
if(!vis[v]){
dfs(v,u);
if(flag)return;
low[u]=min(low[u],low[v]);
}else if(vis[v]==){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){//缩点
qltNum++;
int t=;
do{
t++;
v=st.top();st.pop();
vis[v]=;
qltMap[v]=qltNum;
if(t>=){
flag=;
return;
}
}while(v!=u);
//cout<<t<<"\n";
}
}
void tarjan(){
for(int i=;i<=n;++i){
if(!vis[i]){
dfs(i,-);
}
if(flag)return;
}
}
void init(){//初始化
while(!st.empty())st.pop();
qltNum=idex=flag=;
tot=-;
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
memset(qltMap,,sizeof(qltMap));
}
int main(int argc, char const *argv[]){
int a,b,m;
while(~scanf("%d%d",&n,&m)&&(n)){
init();
memset(head,-,sizeof(head));
for(int i=;i<m;++i){
scanf("%d%d",&a,&b);
a++,b++;
add(a,b);
}
tarjan();
if(flag)printf("NO\n");
else printf("YES\n");
}
return ;
}
hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序的更多相关文章
- HDU3342:判断有向图中是否存在3元环-Tarjan或拓扑排序
题目大意: 给你一个关系图,判断是否合法.每个人都有师父和徒弟,可以有很多个: 若A是B的师父,B是C的师父,则A也算C的师父. 不合法: 1) . 互为师徒:(有回路) 2) .你的师父是你徒弟 ...
- <数据结构>XDOJ323.判断有向图中是否有环
问题与解答 问题描述 判断有向图中是否有环. 输入格式 输入数据第一行是一个正整数,表示n个有向图,其余数据分成n组,每组第一个为一个整数,表示图中的顶点个数n,顶点数不超过100,之后为有向图的邻接 ...
- 有向图的拓扑排序算法JAVA实现
一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径……并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...
- hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】
Triangle LOVE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 有向图和拓扑排序Java实现
package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...
- Expm 10_1 带负权值边的有向图中的最短路径问题
[问题描述] 对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环. package org.xiu68.exp.exp10; p ...
- POJ 1860 Currency Exchange(如何Bellman-Ford算法判断图中是否存在正环)
题目链接: https://cn.vjudge.net/problem/POJ-1860 Several currency exchange points are working in our cit ...
- DFS应用——遍历有向图+判断有向图是否有圈
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "DFS应用--遍历有向图+判断有向图是否有圈" 的idea 并用源代码加以实现 : ...
- HDU3342有向图判圈DFS&&拓扑排序法
HDU3342 Legal or Not 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目意思:一群大牛互相问问题,大牛有不会的,会被更厉害 ...
随机推荐
- Mycat 配置说明(server.xml)
server.xml 几乎保存了所有mycat需要的系统配置信息,包括 mycat 用户管理.DML权限管理等,其在代码内直接的映射类为SystemConfig 类. user 标签 该标签主要用于定 ...
- FileReader对象的readAsDataURL方法来读取图像文件
FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Dat ...
- java 日期格式处理
Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();Sy ...
- 测试&标准说明文章
这是一篇测试用文章,主要想想怎么把纸质本上的习惯沿袭到博客上来 #coding=utf-8 import sys def main(): print "this is some code f ...
- 在用jQuery时遇到的小问题
1. class类名问题? 在我在class ='看看(2)' ,凡是这样的居然给自身加其他style样式,居然添加不上,后来改成其他类名不带括号里的,居然好了. 2. line-height 引入的 ...
- js网页判断移动终端浏览器版本信息是安卓还是苹果ios,判断在微信浏览器跳转不同页面,生成二维码
一个二维码,扫描进入网页,自动识别下载苹果和安卓客户端,判断网页如下,(只有苹果的微信不能自动跳转)所以加个微信判断. <!DOCTYPE html> <html> <h ...
- hibernate框架学习笔记4:主键生成策略、对象状态
创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...
- VS2017调试器无法附加到IIS进程(w3wp.exe)
问题描述: 当使用VS2017-> 调试->附加到进程来调试IIS进程(w3wp.exe)时,报错"无法附加到进程,已附加了一个调试器" 为了解决这个问题花了不少时间, ...
- Software Engineering-HW2
title: Software Engineering-HW2 date: 2017-09-21 10:35:47 tags: HW --- 题目描述 从<构建之法>第一章的 " ...
- 团队作业8——测试与发布(Beta阶段)
Deadline: 2017-12-17 23:00PM,以博客发表日期为准. 评分基准: 按时交 - 有分,检查的项目包括后文的三个方面 测试报告 发布说明 展示博客(单独一篇博客) 晚交 - ...