判断图是否单连通,先用强连通分图处理,再拓扑排序,需注意:

符合要求的不一定是链
拓扑排序列结果唯一,即在队列中的元素始终只有一个

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
#include<stack>
using namespace std;
typedef long long LL;
const int N = 1008, INF = 0x3F3F3F3F;
int dfn[N],id[N];
int lab,cnt;
stack <int> st;
int n, m;
int head[N], tot;
int indeg[N];
vector<int> g[N];
void init(){
memset(head, - 1,sizeof(head));
tot= 0;
} struct Edge{
int to, next;
}edge[20008]; void add(int u, int v){
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
} int dfs(int u){
int lowu=dfn[u]=++lab;
st.push(u);
for(int i = head[u];i!=-1;i=edge[i].next){
int v = edge[i].to;
if(!dfn[v]){
int lowv = dfs(v);
lowu = min(lowu, lowv);
}else if(!id[v]) {
lowu = min(lowu, dfn[v]);
}
}
if(lowu == dfn[u]){
cnt++;
while(1){
int x = st.top();
st.pop();
id[x] = cnt;
if(x == u) break;
}
}
return lowu;
}
int tarjan(){
for(int i=1;i<=n;i++) {
dfn[i] = id[i] = 0;
}
lab=cnt=0;
for(int i=1;i<=n;i++) {
if(!dfn[i]){
dfs(i);
}
}
return cnt;
} //符合要求的不一定是链
//拓扑排序列结果唯一,即在队列中的元素始终只有一个
bool topsort(int n){
queue<int > q;
int sum = 0;
for(int i = 1; i <= n; i++){
if(indeg[i] == 0){
q.push(i);
if(q.size() > 1){
return false;
}
}
}
while(!q.empty()){
int u = q.front();
q.pop();
sum++;
for(int i= 0; i < g[u].size(); i++){
int v = g[u][i];
indeg[v]--;
if(indeg[v] == 0){
q.push(v);
}
}
if(q.size() > 1){
return false;
}
}
if(sum != n){
return false;
}
return true;
}
int main(){
int t;
cin>>t;
while(t--){
init();
memset(indeg, 0, sizeof(indeg));
scanf("%d %d", &n, &m);
while(m--){
int u, v;
scanf("%d %d", &u, &v);
add(u, v);
}
tarjan();
for(int i =1; i<= cnt; i++){
g[i].clear();
}
for(int u = 1; u <= n; u++){
for(int i = head[u] ; ~i ; i = edge[i].next){
int v = edge[i].to;
if(id[u] != id[v]){
indeg[id[v]]++;
g[id[u]].push_back(id[v]);
}
}
}
if(topsort(cnt)){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}

  

POJ2762 Going from u to v or from v to u(单连通 缩点)的更多相关文章

  1. POJ2762 Going from u to v or from v to u? 强连通+缩点

    题目链接: poj2762 题意: 给出一幅单向图.问这张图是否满足   随意两点ab 都能 从a到达b 或  从b到达a 题解思路: 推断一幅图是否满足弱连通 首先想到的是将图中的 强连通分量(能互 ...

  2. POJ2762 Going from u to v or from v to u?(判定单连通图:强连通分量+缩点+拓扑排序)

    这道题要判断一张有向图是否是单连通图,即图中是否任意两点u和v都存在u到v或v到u的路径. 方法是,找出图中所有强连通分量,强连通分量上的点肯定也是满足单连通性的,然后对强连通分量进行缩点,缩点后就变 ...

  3. [poj2762] Going from u to v or from v to u?(Kosaraju缩点+拓排)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud     Going from u to v or from v to u? Tim ...

  4. poj2762 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: 13040 ...

  5. 【缩点+拓扑判链】POJ2762 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 ...

  6. Oracle基本数据字典:v$database、v$instance、v$version、dba_objects

    v$database: 视图结构: SQL> desc v$database; Name                                      Null?    Type - ...

  7. Going from u to v or from v to u?_POJ2762强连通+并查集缩点+拓扑排序

         Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K       Description I ...

  8. 临时文件相关的v$tempfile v$sort_usage与V$tempseg_usage

    SQL> select username,user,segtype,segfile#,segblk#,extents,segrfno# from v$sort_usage; SEGFILE#代表 ...

  9. [强连通分量] 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 ...

随机推荐

  1. ajax初探01

    1.为什么使用ajax ajax使用异步处理模型,意味着在浏览器等待数据加载期间,用户可以做其他事情 在页面正在加载时使用ajax:使用ajax,浏览器可以向服务器请求一些数据,并且一旦数据请求发出, ...

  2. python字符串函数

  3. c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

    Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel ...

  4. linux多线程下载工具mwget

    linux多线程下载工具mwget 经常使用wget进行文件下载,然而wget的处理速度并不如人意.遇到一些国外的站点,经常慢得像蜗牛一般.然而为了解决这个问题,便有了mwget:m表示multi多线 ...

  5. Call to undefined function mysql_connnect()

    PHP Fatal error:  Call to undefined function mysql_connnect() in /var/www/html/mysqltest.php on line ...

  6. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  7. ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

    这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...

  8. 8.nodejs权威指南--MongoDB

    1. MongoDB var mongo = require('mongodb'); var host = '127.0.0.1'; var port = mongo.Connecton.DEFAUL ...

  9. Redis Sentinel高可用架构

    Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis se ...

  10. ABAP ole方式对EXCEL进行操作

    DATA: excel    TYPE ole2_object,       workbook TYPE ole2_object,       sheet    TYPE ole2_object,   ...