POJ 2762 Going from u to v or from v to u? Tarjan算法 学习例题
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 17104 | Accepted: 4594 |
Description
Input
The first line for each case contains two integers n, m(0 < n < 1001,m < 6000), the number of rooms and corridors in the cave. The next m lines each contains two integers u and v, indicating that there is a corridor connecting room u and room v directly.
Output
Sample Input
- 1
- 3 3
- 1 2
- 2 3
- 3 1
Sample Output
- Yes
Source
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<stack>
- #define maxm 6010
- #define maxn 1010
- using namespace std;
- int T,n,m;
- struct edge{
- int u,v,next;
- }e[maxm],ee[maxm];
- int head[maxn],js,headd[maxn],jss;
- bool exist[maxn];
- int visx,cur;// cur--缩出的点的数量
- int dfn[maxn],low[maxn],belong[maxn];
- int rudu[maxn],chudu[maxn];
- stack<int>st;
- void init(){
- memset(rudu,,sizeof(rudu));memset(chudu,,sizeof(chudu));
- memset(head,,sizeof(head));memset(headd,,sizeof(headd));
- jss=js=visx=cur=;
- memset(exist,false,sizeof(exist));
- while(!st.empty())st.pop();
- memset(dfn,-,sizeof(dfn));memset(low,-,sizeof(low));
- memset(belong,,sizeof(belong));
- }
- void add_edge1(int u,int v){
- e[++js].u=u;e[js].v=v;
- e[js].next=head[u];head[u]=js;
- }
- void tarjan(int u){
- dfn[u]=low[u]=++visx;
- exist[u]=true;
- st.push(u);
- for(int i=head[u];i;i=e[i].next){
- int v=e[i].v;
- if(dfn[v]==-){
- tarjan(v);
- if(low[v]<low[u]) low[u]=low[v];
- }
- else if(exist[v]&&low[u]>dfn[v]) low[u]=dfn[v];
- }
- int j;
- if(low[u]==dfn[u]){
- ++cur;
- do{
- j=st.top();st.pop();exist[j]=false;
- belong[j]=cur;
- }while(j!=u);
- }
- }
- void add_edge2(int u,int v){
- ee[++jss].u=u;ee[jss].v=v;
- ee[jss].next=headd[u];headd[u]=jss;
- }
- bool topo()
- {
- int tp=,maxt=;
- for(int i=;i<=cur;i++)
- {
- if(rudu[i]==){
- tp++;
- }
- if(chudu[i]>maxt)maxt=chudu[i];
- }
- if(tp>)return ;// 入读等于0的缩点只能有一个 否则..
- if(maxt>)return ;
- return ;
- }
- int main()
- {
- scanf("%d",&T);
- while(T--){
- scanf("%d%d",&n,&m);
- init();
- int u,v;
- for(int i=;i<m;i++){
- scanf("%d%d",&u,&v);add_edge1(u,v);
- }
- for(int i=;i<=n;i++){// 求强连通分量
- if(dfn[i]==-) tarjan(i);
- }
- for(int i=;i<=js;i++){
- int u=e[i].u,v=e[i].v;
- if(belong[u]!=belong[v]){
- add_edge2(belong[u],belong[v]);
- rudu[belong[v]]++;chudu[belong[u]]++;
- }
- }
- if(topo()==) printf("Yes\n");
- else printf("No\n");
- }
- return ;
- }
思路:首先建一个有向图,进行Tarjan算法,进行缩点,缩完点之后,再建一张有向图(这张图只能成一条链),对其进行检验,入度为0的店只能有一个或没有。。
POJ 2762 Going from u to v or from v to u? Tarjan算法 学习例题的更多相关文章
- KMP算法 学习例题 POJ 3461Oulipo
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37971 Accepted: 15286 Description The ...
- POJ 2762 Going from u to v or from v to u? (强连通分量缩点+拓扑排序)
题目链接:http://poj.org/problem?id=2762 题意是 有t组样例,n个点m条有向边,取任意两个点u和v,问u能不能到v 或者v能不能到u,要是可以就输出Yes,否则输出No. ...
- poj 2762 Going from u to v or from v to u?(强连通分量+缩点重构图+拓扑排序)
http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: ...
- POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)
职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可 ...
- POJ 2762 Going from u to v or from v to u? (判断单连通)
http://poj.org/problem?id=2762 题意:给出有向图,判断任意两个点u和v,是否可以从u到v或者从v到u. 思路: 判断图是否是单连通的. 首先来一遍强连通缩点,重新建立新图 ...
- [ tarjan + dfs ] poj 2762 Going from u to v or from v to u?
题目链接: http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS Memory L ...
- POJ 2762 Going from u to v or from v to u?(强联通,拓扑排序)
id=2762">http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS ...
- [强连通分量] POJ 2762 Going from u to v or from v to u?
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17089 ...
- poj 2762 Going from u to v or from v to u?【强连通分量缩点+拓扑排序】
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15812 ...
随机推荐
- 迅为IMX6Q开发板在道路交通信号控制系统解决方案中的应用
智能交通综合管控平台是为交通指挥系统服务的统一信息平台,以信息技术为主导,以计算机通信网络和智能化指挥控制管理为基础,建成集高新技术应用为一体的智能化指挥调度集成平台,实现信息交换与共享.快速反应决策 ...
- bzoj 2658
首先考虑容斥 我们计算出所有没有点在其中的矩形,然后用所有矩形减去这些矩形即可 然后考虑如何计算没有点在其中的矩形 采用扫描线的思想,从上向下一行一行扫,假设我们扫到的行编号是$a$,然后考虑如果左右 ...
- #include <> 和 #inlude ""的区别
#include < >引用的是编译器的类库路径里面的头文件#include " "引用的是你程序目录的相对路径中的头文件,在程序目录的相对路径中找不到该头文件时会继 ...
- 【dp】淘宝的推荐系统
可能最近做二分和DFS做傻了? 小明刚刚入职淘宝,老大给他交代了一个简单的任务,实现一个简易的商品推荐系统. 这个商品推荐系统的需求如下: 一共有 n 件商品可以被推荐,他们的编号分别为 1 到 n. ...
- [LUOGU] 3959 宝藏
https://www.luogu.org/problemnew/show/P3959 注意到n非常小,考虑状压/搜索. 发现状压需要枚举起点,跑n次,一个问题是转移不可以以数字大小为阶段了,考虑用d ...
- 介绍几款移动的WebAPP框架
如果是 Angular 那就选 Ionic (一对好 CP)如果是 Vue 那就选 Vux (基于 WeUI)如果是 jQuery 那就选 Framework7 (iOS 和 Android 双皮肤) ...
- MariaDB数据库(五)
1. MariaDB主从架构 1.1 概述 主从架构用来预防数据丢失.主从多用于网站架构,因为主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多 ...
- inotify+rsync sersync+rsync实时同步服务
中小型网站搭建-数据实时的复制-inotify/sersync inotify是一种强大的,细粒度的.异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入inotify支持,通过i ...
- 【http】http协议的队首阻塞
1 队首阻塞 就是需要排队,队首的事情没有处理完的时候,后面的人都要等着. 2 http1.0的队首阻塞 对于同一个tcp连接,所有的http1.0请求放入队列中,只有前一个请求的响应收到了,然后才能 ...
- SVN 如何提交 SO 库文件
今天提交代码时候发现,svn add 还是 svn st 均查看不到想要提交的 so 文件. 后来才知道原来是配置文件出了问题,把so文件的提交给屏蔽掉了. 修改步骤如下: 1.Ubuntu 系统,点 ...