方法一

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1024;
struct Edge
{int s,t;
};
int n,m,dfn[N],low[N],in[N],id[N],cnt,dep,mp[N][N];
vector<Edge>edge;
vector<int>g[N];
stack<int>st;void Addedge(int u,int v)
{Edge tp;tp.s=u,tp.t=v;edge.push_back(tp);g[u].push_back(edge.size()-1);
}void dfs(int u)
{int v,i,k,mx=dfn[u]=low[u]=dep++;st.push(u);for(i=0;i<g[u].size();i++){v=edge[g[u][i]].t;if(dfn[v]==-1) dfs(v);if(mx>low[v]) mx=low[v];}if(mx<low[u]){low[u]=mx;return ;}//printf("%d\n",cnt);do{k=st.top();st.pop();id[k]=cnt;low[k]=n;}while(k!=u);cnt++;
}void dfs1(int u,int q)
{dfn[u]=1;dep=max(dep,q);for(int i=0;i<cnt;i++){if(mp[u][i]==1)dfs1(i,q+1);}
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int _,i,u,v;scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);for(i=0; i<n; i++){g[i].clear();id[i]=i;}edge.clear();for(i=0; i<m; i++){scanf("%d%d",&u,&v);Addedge(u-1,v-1);}dep=0;cnt=0;while(!st.empty()) st.pop();memset(dfn,0xff,sizeof(dfn));for(i=0; i<n; i++){if(dfn[i]==-1)dfs(i);}memset(in,0,sizeof(in));memset(mp,0,sizeof(mp));for(i=0; i<m; i++){u=id[edge[i].s];v=id[edge[i].t];//printf("%d %d\n",u,v);if(u!=v){in[v]++;mp[u][v]=1;}}memset(dfn,0,sizeof(dfn));for(i=0,dep=0;i<cnt;i++){if(dfn[i]==0) dfs1(i,1);}if(dep==cnt) printf("Yes\n");else printf("No\n");}return 0;
}

方法二

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1024;
struct Edge
{int s,t;
};
int n,m,dfn[N],low[N],in[N],id[N],cnt,dep,mp[N][N];
vector<Edge>edge;
vector<int>g[N];
stack<int>st;void Addedge(int u,int v)
{Edge tp;tp.s=u,tp.t=v;edge.push_back(tp);g[u].push_back(edge.size()-1);
}void dfs(int u)
{int v,i,k,mx=dfn[u]=low[u]=dep++;st.push(u);for(i=0;i<g[u].size();i++){v=edge[g[u][i]].t;if(dfn[v]==-1) dfs(v);if(mx>low[v]) mx=low[v];}if(mx<low[u]){low[u]=mx;return ;}//printf("%d\n",cnt);do{k=st.top();st.pop();id[k]=cnt;low[k]=n;}while(k!=u);cnt++;
}int topsort()
{int i,u,v,p;stack<int>S;for(i=0;i<cnt;i++){//printf("%d\n",in[i]);if(in[i]==0)S.push(i);}//printf("%d\n",S.size());p=0;while(S.size()==1){u=S.top();S.pop();p++;for(i=0;i<cnt;i++){if(mp[u][i]==1){in[i]--;if(in[i]==0) S.push(i);}}}if(p==cnt) return 1;else return 0;
}int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int _,i,u,v;scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);for(i=0; i<n; i++){g[i].clear();id[i]=i;}edge.clear();for(i=0; i<m; i++){scanf("%d%d",&u,&v);Addedge(u-1,v-1);}dep=0;cnt=0;while(!st.empty()) st.pop();memset(dfn,0xff,sizeof(dfn));for(i=0; i<n; i++){if(dfn[i]==-1)dfs(i);}memset(in,0,sizeof(in));memset(mp,0,sizeof(mp));for(i=0; i<m; i++){u=id[edge[i].s];v=id[edge[i].t];if(u!=v&&!mp[u][v]){in[v]++;mp[u][v]=1;}}if(topsort()) printf("Yes\n");else printf("No\n");}return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

转载于:https://www.cnblogs.com/xryz/p/4847783.html

poj Going from u to v or from v to u? 强联通缩点+拓扑排序(或搜索)相关推荐

  1. POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)

    [题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...

  2. POJ 2186 Popular Cows (强联通分量)

    链接 :http://poj.org/problem?id=2186 一个联通分量里的所有的牛满足任何一个被其他牛认为是红人.强联通缩点之后 只需要找到一个且只有一个联通分量且它的出度为0 答案就是这 ...

  3. POJ 2762 Going from u to v or from v to u? (判断单连通)

    http://poj.org/problem?id=2762 题意: 给出有向图,判断任意两个点u和v,是否可以从u到v或者从v到u. 思路: 判断图是否是单连通的. 首先来一遍强连通缩点,重新建立新 ...

  4. 【POJ - 2762】Going from u to v or from v to u?(Tarjan缩点,树形dp 或 拓扑排序,欧拉图相关)

    题干: In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms ...

  5. [POJ] 3687 Labeling Balls(拓扑排序)

    题目地址:http://poj.org/problem?id=3687 反向建边,即重的球指向轻的球,注意重边,然后拓扑排序.从n-->1循环,即每次从入度为0的球里面选编号大的存(包含输入的逻 ...

  6. 拓扑排序 POJ - 3687反向图跑字典序(重边)

    题目链接:http://poj.org/problem?id=3687 题目大意: 给定N个球,这些球的编号分别是1-N中的某个数字,它们的重量也分别是1-N中的某个数字,任意两个球的编号和重量不相等 ...

  7. poj 4084:拓扑排序

    poj 4084:拓扑排序 非常好的题目,恶心的算法 描写叙述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下.编号小的顶点在前. 输入 若干行整数,第一行有2个数,分别为顶点数v和弧数a,接 ...

  8. Poj 1094 拓扑排序Kahn

    Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...

  9. vscode 终端 进入node_安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效

    前言 最近写TypeScript需要安装.配置Node.js环境,楼主是使用的安装包所以环境变量都是自动就配好了(如果是下载的zip压缩包解压后要自己配置到系统环境变量中).打开系统终端敲入命令 no ...

最新文章

  1. Mythic推出“万能”芯片,任何设备都能一秒变身智能产品
  2. 为什么你不该用Timer
  3. [YTU]_2474( C++习题 输入输出--保护继承)
  4. maven小节,Nexus私服,构件打包发布,动态资源过滤,自动部署到本地或远程服务器...
  5. Django之静态文件
  6. oracle10g自带的公共同义词,10g ALL_SYNONYMS同义词查询性能下降
  7. Monkey稳定性测试,多少还是要了解一下的(上)
  8. 超级计算机 500,191台超算500强排名分布区间:前百强4台,前两百强31台
  9. 选课系统类图与数据结构图
  10. 项目-字典-更新字典分组
  11. ssm中小型酒店客房预订系统计算机毕业设计
  12. dht磁力链php,基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
  13. 实现校园网花样上网方法
  14. 酷!有人把火星车都造出来了,教程全面开源
  15. Android studio底部Logcat模块不见了以及Locat日志中包含了很多无用的错误日志筛选方法
  16. 【数据结构基础_有[*pHead]和[*pEnd]的单向链表_(C++实现)】
  17. Win 11 预览版虚拟机安装
  18. SSM酒店管理系统旅店(含源码+论文+答辩PPT等)
  19. 1.43 亿人信息被盗,整个美国都慌了;Linux 发行版 SUSE 诞生 25 周年
  20. 二叉树、B树、红黑树

热门文章

  1. 【python之路】数据库2
  2. 洛谷 P3392 涂国旗
  3. 木棒,POJ(1011)
  4. 寻找字符串中第一个仅仅出现一次打字符
  5. ASP.NET中TextBox控件的AutoCompleteType属性(不保存历史输入记录)
  6. setsockopt()用法(转载)
  7. 入门指南_激光切管快速入门指南
  8. 大厂Java岗面试心得记录
  9. npm run dev/build/serve
  10. Android 识别图片二维码