POJ 2762推断单个联通(支撑点甚至通缩+拓扑排序)
|
Going from u to v or from v to u?
Description
In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors connecting some rooms. Each time, Wind choose two rooms x and y, and ask one of their little sons go from one to the other. The son can either
go from x to y, or from y to x. Wind promised that her tasks are all possible, but she actually doesn't know how to decide if a task is possible. To make her life easier, Jiajia decided to choose a cave in which every pair of rooms is a possible task. Given a cave, can you tell Jiajia whether Wind can randomly choose two rooms without worrying about anything? Input
The first line contains a single integer T, the number of test cases. And followed T cases.
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
The output should contain T lines. Write 'Yes' if the cave has the property stated above, or 'No' otherwise.
Sample Input 1 Sample Output Yes Source
POJ Monthly--2006.02.26,zgl & twb
|
[Submit] [Go Back] [Status]
[Discuss]
题意:对于随意两个节点u,v。假设能从u到v或者v到u,那么输出Yes,否则输出No。
思路:先强连通缩点,此时一定不含环,看能不能找到一条最长路包括全部的缩点即可(实际上是找推断单链),用拓扑排序就ok,只是假设仅仅有一个强连通分量那么一定是Yes啦,否则topo排序推断 ,代码例如以下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn =1e4+10;
const ll mod=20140413;
vector<int>G1[maxn],G2[maxn],G[maxn];
int sccno[maxn],vis[maxn],scc_cnt;//sccno强连通编号,scc_cnt表示强连通分量的个数
int ind[maxn];//ind表示入度
void init_G(int n)//初始化缩点图
{
memset(ind,0,sizeof ind);
for(int i=1;i<=n;i++)G[sccno[i]].clear();
for(int i=1;i<=n;i++) {
for(int j=0;j<G1[i].size();++j){
int &v =G1[i][j];
if(sccno[i]!=sccno[v]) {
G[sccno[i]].push_back(sccno[v]);
ind[sccno[v]]++;
}
}
}
}
bool toposort(int n)//topo排序
{
init_G(n);
int u,cnt=0;
queue<int>q;
for(int i=1;i<=n;i++){
if(!ind[sccno[i]]){
if(!q.empty())return false;
q.push(sccno[i]);
cnt++;
}
}
while(!q.empty()){
u=q.front();
q.pop();
ind[u]=-1;
for(int i=0;i<G[u].size();i++) {
int &v=G[u][i];
ind[v]--;
if(ind[v]==0){
if(!q.empty())return false;
q.push(v);
cnt++;
}
}
}
return cnt==scc_cnt;
}
vector<int>S;
void init(int n)
{
memset(vis,0,sizeof vis);
memset(sccno,0,sizeof sccno);
S.clear();
scc_cnt=0;
for(int i=1;i<=n;i++) {
G1[i].clear();
G2[i].clear();
G[i].clear();
}
}
void AddEdge(int u,int v)
{
G1[u].push_back(v);
G2[v].push_back(u);
}
void dfs1(int u)
{
if(vis[u])return ;
vis[u]=1;
for(int i=0;i<G1[u].size();i++)dfs1(G1[u][i]);
S.push_back(u);
}
void dfs2(int u)
{
if(sccno[u]) return ;
sccno[u]=scc_cnt;
for(int i=0;i<G2[u].size();++i)dfs2(G2[u][i]);
}
bool is_Semiconnect(int n)///计算强连通分量,初步推断
{
for(int i=1;i<=n;i++)dfs1(i);
for(int i=S.size();i>=1;i--){
if(!sccno[S[i-1]]){
scc_cnt++;
dfs2(S[i-1]);
}
}
return scc_cnt<=1;
}
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
int u,v;
init(n);
while(m--) {
scanf("%d%d",&u,&v);
AddEdge(u,v);
}
if(is_Semiconnect(n))puts("Yes");
else{
if(toposort(n))puts("Yes");
else puts("No");
}
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
POJ 2762推断单个联通(支撑点甚至通缩+拓扑排序)的更多相关文章
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- 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(强连通+判断链)
题目链接:http://poj.org/problem?id=2762 思路:首先当然是要缩点建新图,由于题目要求是从u->v或从v->u连通,显然是要求单连通了,也就是要求一条长链了,最 ...
- 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(强连通分量+拓扑排序)
题目链接:http://poj.org/problem?id=2762 题意:给出一个有向图,判断任意的两个顶点(u,v)能否从u到达v,或v到达u,即单连通,输出Yes或No. 分析:对于同一个强连 ...
- [强连通分量] 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 3177-3352边双联通
买一送一啊 3177和3352的区别在于3177数据有重边!但是我先做3177的 那么就直接ctrl+c+v搞3352了~. 题意:给一个无向图,要令每个点之间至少有两条不重合的路,需要至少加多少 ...
- POJ 2762 Going from u to v or from v to u?- Tarjan
Description 判断一个有向图是否对于任意两点 $x$, $y$ 都有一条路径使$x - >y$或 $y - >x$ Solution 对于一个强联通分量内的点 都是可以互相到达 ...
随机推荐
- Android之TextView------LINK的点击事件
package com.TextHtml; import android.app.Activity; import android.content.Context; import android.os ...
- Python3.5.1 下使用HTMLParser报错
pip 安装HTMLParser之后,import HTMLParser 使用的时候,报错"ImportError:Can't not find module markupbase" ...
- Python 函数基础、有序集合、文件操作(三)
一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...
- 搞清楚学习Web的目的,是为了推广自己的产品和服务,不是为了替人接单做网页
只有这样,Web才不会沉沦于下流,才会对自己的事业有真正的帮助-
- 练习 jquery+Ajax+Json 绑定数据 分类: asp.net 练习 jquery+Ajax+Json 绑定数据 分类: asp.net
练习 jquery+Ajax+Json 绑定数据
- JQuery中两个ul标签的li互相移动实现方法
这篇文章主要介绍了JQuery中两个ul标签的li互相移动实现方法,可实现ul标签中li标签内容相互替换的技巧,涉及jQuery操作页面元素的相关技巧,需要的朋友可以参考下 本文实例讲述了JQuery ...
- HTMLParser-简单HTML和XHTML解析
使用HTMLParser模块解析HTML页面 HTMLParser是python用来解析html和xhtml文件格式的模块.它可以分析出html里面的标签.数据等等,是一种处理html的简便途径.HT ...
- 九度OnlineJudge之1023:EXCEL排序
题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始).随后在 N ...
- DataSource绑定DataTable.Select()显示system.data.DataRow问题解决的方法
有时候我们须要在控件中绑定DataTable中设定条件过滤后的数据,此时,在winForm环境中,一些控件不能正确绑定并显示数据内容.这是由于DataTable.Select()返回的是DataRow ...
- HDOJ 1272 并查集 不相同父节点
判断两点:1.任何2点的父节点不能相同->否则会导致2点间有多条通路2.所有点只有1个集合 存在一个小坑,就是第一次输入 0 0 的时候,应该输出 Yes , 否则会WA MY AC Code ...