博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2767,单向连通图判定,缩点+重新建图+新图DFS
阅读量:7008 次
发布时间:2019-06-28

本文共 1211 字,大约阅读时间需要 4 分钟。

/*该题被博客里标记为中等题,30分钟内1A,掌握了算法就简单了,单向连通图判定,单向连通图缩点后必然唯一存在出度为0的点和入度为0的点,并且从入度为0的点出发,可以遍历所有点后到达出度为0点(一条长链),(容易反证),所以缩点后,我重新建图(以前觉得重新建图好麻烦,现在看来SO easy),,对新有向无环图,从入度为0的点做dfs(回溯时要标记回来,因为要所有dfs路线),有一条深度到达强连通分支数即为yes,反之no*/#include
//297MS, 1A,简单题。#include
#include
#include
#include
using namespace std;int n;int m;const int MAX=1001;vector
>edges(MAX); //原图vector
>newedge(MAX);//缩点后图int visited[MAX]; //原图tarjanint low[MAX];int dfn[MAX];bool mark[MAX]; //新图dfs标记int Strongly_connected_branch[MAX]; //并为一个强连通,标记为1.2.3...int num;int times; stack
s; bool instack[MAX];int ind[MAX]; //入度数组void tarjan(int u){ low[u]=dfn[u]=times++; instack[u]=1; s.push(u); int len=edges[u].size(); for(int i=0;i
low[v])low[u]=low[v]; } else if(instack[v]&&low[u]>dfn[v]) //有向图,要问是否在栈中,后向边,V为U某个祖先 { low[u]=dfn[v]; } } if(dfn[u]==low[u]) //在一个SCC { num++;int temp; do { temp=s.top(); instack[temp]=0; s.pop(); Strongly_connected_branch[temp]=num; } while(temp!=u); }}bool is_no; void dfs(int u,int depth) //新图的dfs{ if(depth==num)is_no=true; int len=newedge[u].size(); for(int i=0;i

转载于:https://www.cnblogs.com/yezekun/p/3925813.html

你可能感兴趣的文章
假期工作经历感想
查看>>
密码应用技术系列之1:密码应用技术概述
查看>>
2018.04.28
查看>>
virtualenv 虚拟环境
查看>>
PDF转word文档
查看>>
解决127.0.0.1 localhost 劫持问题
查看>>
安全模式下无法使用键盘
查看>>
CMD Shell ***小全(一)
查看>>
mysql 二
查看>>
CentOS6升级Python2.6到3.7,错误处理[No module named '_ctyp
查看>>
【游戏推荐】疯狂豹子王--OGEngine精品游戏推荐系列【三】
查看>>
致加西亚的信(一)
查看>>
折腾一天的WordPress
查看>>
主机是否扫描之fping
查看>>
一封来自网络的情书
查看>>
元数据和纬度
查看>>
Centos 下安装vsftp
查看>>
第 4 章 容器 - 022 - 如何运行容器?
查看>>
jqurey datatables属性
查看>>
新手上路--linux命令基础
查看>>