poj 2762 Going from u to v or from v to u

原创 2012年03月21日 09:50:50

类型:有向图连通性

题目:http://poj.org/problem?id=2762 判断一个有向图单向连通性

来源:POJ Monthly--2006.02.26,zgl & twb

思路:对于强连通分量中的点相互连通,可以将其看做一个点处理。搜索所有的强连通分量,对强连通分量缩点后,构造新图进行拓扑排序,判断是否成链。如果成链,结果为真。假如不成链,即存在某时刻两个点的入度都为0,则该两点不连通。

// poj 2762 - Going from u to v or from v to u
// ac 1308K	344MS
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;

#define MIN(a,b) (a < b ? a : b)
#define clr(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for((i) = (a); (i) < (b); ++i)
#define FORE(i,a,b) for((i) = (a); (i) <= (b); ++i)
#define MAXN 1010
#define MAXM 6010

bool in_stack[MAXN],graph[MAXN][MAXN];
int num,cnt,count_node,kk,m,n,cnt_num;
int in[MAXN];
int step[MAXN];
int low[MAXN];
int head[MAXN];
int belong[MAXN];
stack<int> st;
struct edge{
    int v,nxt;
}e[MAXM];

void Tarjan(int u) {
    int v;
    int i,j;

    step[u] = low[u] = ++num;
    st.push(u);
    in_stack[u] = true;
    for(i = head[u]; i != -1; i = e[i].nxt){
        v = e[i].v;
        if(!step[v]){
            Tarjan(v);
            low[u] = MIN(low[u],low[v]);
        }
        else if(in_stack[v])
            low[u] = MIN(low[u],step[v]);
    }
    if(step[u] == low[u]){
        cnt_num++;
        do{
            j = st.top();
            st.pop();
            in_stack[j] = false;
            belong[j] = cnt_num;
        }while(j != u);
    }
}

bool topo() {
    int i,j;
    int tmp,k,in_num;

    tmp = 0;
    while(1){
        k = in_num = 0;
        FORE(i,1,cnt_num)
            if(in[i] == 0){
                in_num++;
                k = i;
            }
        if(in_num > 1)
            return 0;
        if(k == 0)
            break;
        FORE(j,1,cnt_num)
            if(graph[k][j])
                in[j]--;
        in[k] = -1;
        tmp++;
    }
    return (tmp == cnt_num) ? 1 : 0;
}

int main() {
    int i,j,u,v,t;

    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        clr(head,-1); clr(step,0); clr(belong,0); clr(in,0);
        clr(graph,false); clr(in_stack,false);
        num = cnt = cnt_num = kk = count_node = 0;
        FOR(i,0,m){
            scanf("%d%d",&u,&v);
            e[cnt].v  = v;
            e[cnt].nxt = head[u];
            head[u] = cnt++;
        }
        FORE(i,1,n)
            if(!step[i])
                Tarjan(i);
        FORE(i,1,n)
            for(j = head[i]; j != -1; j = e[j].nxt)
                if(belong[i] != belong[e[j].v]){
                    graph[belong[i]][belong[e[j].v]] = true;
                    in[belong[e[j].v]] = 1;
                }
        if(topo())
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}


poj-2762-Going from u to v or from v to u?-tarjan算法求缩点+算是不是一字链

tarjan求缩点,然后算缩点之后的图是不是一字链。 判断是不是一字链很简单,直接dfs求出一条最长边。 看最长边是不是等于缩点之后的数目即可。 #include #include #incl...
  • rowanhaoa
  • rowanhaoa
  • 2014年04月09日 20:20
  • 1661

POJ - 2762 Going from u to v or from v to u?(拓扑排序+强连通分量)

题目大意:给出N个点,M条有向边,问是否任意两点u,v都满足u能到达v或者v能到达u解题思路:强连通分量内的所有的点都满足,接着要判断一下其他的点能否满足了 求出所有的强连通分量,接着缩点,用桥连接...
  • L123012013048
  • L123012013048
  • 2015年08月15日 00:49
  • 1043

POJ 2762 Going from u to v or from v to u?(Tarjan)

题意:对任给的两个点x,y,是否一定有路,从x到y,或者从y到x,,,刚开始看错了,以为是赤裸裸的Tarjan,结果是或,不是且,,比较简单 #include #include #include...
  • binwin20
  • binwin20
  • 2012年08月17日 15:52
  • 1376

POJ 2762 Going from u to v or from v to u? 缩点

问所有点对间是否有单向路可达。缩点以后变成了一个DAG,那么判断入度0的点和出度0的点有几个即可。 然后只有入度0的s和出度0的t各1个点的时候,只有存在一条链从s到t且经过所有的点的时候,图才弱联...
  • huanghongxun
  • huanghongxun
  • 2016年03月07日 22:43
  • 241

poj 2762 Going from u to v or from v to u?

tarjan算法学习 https://www.byvoid.com/blog/scc-tarjan/
  • turbo_7
  • turbo_7
  • 2014年04月22日 18:59
  • 480

poj 2762 Going from u to v or from v to u

本题题意为:给你n个点m条单向边。
  • CHCXCHC
  • CHCXCHC
  • 2014年06月13日 13:02
  • 1229

POJ 2762 Going from u to v or from v to u?

题意: 给你n 思路: 注意这里只要有一条路径存在即可,那么明显强连通分量里的任意两点都是可达的,所以可以用Tarjan把强连通分量缩成一点,然后判断该图是否任意两点之间存在一条路径,其实就是判断是否...
  • w446506278
  • w446506278
  • 2016年07月23日 20:26
  • 79

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 ...
  • madaidao
  • madaidao
  • 2014年11月29日 13:47
  • 289

POJ 2762 Going from u to v or from v to u?

 #includeusing namespace std;#define MAX 6010typedef struct arc{ int adj; int next;}arc;struct EDGE{...
  • xhuacmer
  • xhuacmer
  • 2009年04月26日 19:03
  • 508

2762 - Going from u to v or from v to u?

tarjan板
  • wamach
  • wamach
  • 2017年07月15日 17:01
  • 71
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2762 Going from u to v or from v to u
举报原因:
原因补充:

(最多只允许输入30个字)