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 题目意思:一群大牛互相问问题,大牛有不会的,会被更厉害 ...
随机推荐
- 【基础】这15种CSS居中的方式,你都用过哪几种?
简言 CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案汇编整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来,算做是 ...
- Java并发系列[9]----ConcurrentHashMap源码分析
我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别.Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashM ...
- 【Linux】 linux的进程系统一点补充
linux进程系统 ■ 程序 vs. 进程 程序静态地存放在磁盘中.用户可以触发执行程序,被触发后的程序就存进内存中成为一个个体,即为进程. 有些进程(比如crond需要每分钟都扫描.守护进程等等)是 ...
- Android一个小巧的记录app(便签或者日记 随心)
入驻博客园两个月今天第一次发随笔,,话不多说,直接上图展示效果 主界面用的RecyclerView的瀑布流(StaggeredGridLayoutManager),同时加上Floatbutton悬浮按 ...
- [bzoj1707]tanning分配防晒霜_贪心+排序
tanning分配防晒霜 bzoj-1707 题目大意:给出每个点所能接受的区间,给出m个可以使单个点固定在一个值的方法,每种方法能使用有限次. 注释:1<=N<=2500 想法:这题是瞎 ...
- poj3358 Period of an Infinite Binary Expansion
Period of an Infinite Binary Expansion 题目大意:给你一个分数,求这个分数二进制表示下从第几位开始循环,并求出最小循环节长度. 注释:int范围内. 想法:这题说 ...
- 一、Python安装与Pycharm使用入门
一.安装Python 1.Linux下安装 一般系统默认已安装2.6.6版本,升级成2.7版本, 但 2.6 不能删除,因为系统对它有依赖,epel源里最新的也是2.6版本,所以以源代码的方式安装2. ...
- 解决exlicpe以debug模式启动或运行速度非常慢的问题
该问题可能是由于eclipse和tomcat的交互而产生的, 在以debug模式启动tomcat时,发生了读取文件错误, eclipse自动设置了断点,导致tomcat不能正常启动. 解决方法如下:以 ...
- L2-001. 紧急救援(PAT)~最短路应用
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- Beta第三天
听说