POJ2762-Going from u to v or from v to u?(Tarjan缩点,DAG判直链)

Going from u to v or from v to u?

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 14474   Accepted: 3804

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
3 3
1 2
2 3
3 1

Sample Output

Yes

题意:n个点,m条边,判断对于任意两个点u,v u能到v或者v能到u。
思路:Tarjan缩点后,判断一个有向无环图是否是一条直链即可,条件为:起点,终点只有一个,且起点出度为1或0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1000+10;
const int maxe = 6000+10;
struct edge{
    int v,nxt;
}e[maxe];
int head[maxn];
int n,m;
stack<int> S;
queue<int> que;
int in[maxn],out[maxn];
int dfn[maxn],lown[maxn],sccno[maxn];
int dfs_clk,scc_cnt,nume;
void init(){
    dfs_clk = 0;
    scc_cnt = 0;
    nume = 1;
    while(!S.empty()) S.pop();
    while(!que.empty()) que.pop();
    memset(sccno,0,sizeof sccno);
    memset(dfn,0,sizeof dfn);
    memset(in,0,sizeof in);
    memset(out,0,sizeof out);
    memset(head,0,sizeof head);
}
void addedge(int u,int v){
    e[++nume].nxt = head[u];
    e[nume].v = v;
    head[u] = nume;
}
void Tarjan(int u){
    dfn[u] = lown[u] = ++dfs_clk;
    S.push(u);
    for(int i = head[u]; i ; i = e[i].nxt){
        int v = e[i].v;
        if(!dfn[v]){
            Tarjan(v);
            lown[u] = min(lown[u],lown[v]);
        }
        else if(!sccno[v]){//在栈中,能到达的祖先
            lown[u] = min(lown[u],dfn[v]);
        }
    }
    if(lown[u]==dfn[u]){
        scc_cnt++;
        while(true){
            int x = S.top();S.pop();
            sccno[x] = scc_cnt;
            if(x==u) break;
        }
    }
}
int main(){

    int ncase;
    cin >> ncase;
    while(ncase--){
        init();
        scanf("%d%d",&n,&m);
        int a,b;
        for(int i = 0; i < m; i++){
            scanf("%d%d",&a,&b);
            addedge(a,b);
        }
        for(int i = 1; i <= n;i++){
            if(!dfn[i])
                Tarjan(i);
        }
        for(int i = 1; i <= n; i++){
            int k = sccno[i];
            for(int j = head[i]; j; j = e[j].nxt){
                int d = sccno[e[j].v];
                if(k!=d){
                    in[d]++;
                    out[k]++;
                }
            }
        }
        int tr = 0,ts = 0;
        bool flag = true;
        for(int i = 1; i <= scc_cnt; i++){
            if(in[i]==0){
               tr++;
               if(out[i]>1){
                    flag = false;
                    break;
               }
            }
            if(out[i]==0){
                ts++;
            }
        }
        if(flag&&tr==1&&ts==1){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }

    return 0;
}

POJ2762-Going from u to v or from v to u?(Tarjan缩点,DAG判直链)

时间: 2024-11-07 12:49:58

POJ2762-Going from u to v or from v to u?(Tarjan缩点,DAG判直链)的相关文章

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

题目链接: poj2762 题意: 给出一幅单向图.问这张图是否满足   随意两点ab 都能 从a到达b 或  从b到达a 题解思路: 推断一幅图是否满足弱连通 首先想到的是将图中的 强连通分量(能互相到达的顶点集)  进行缩点 然后再依据原有边 又一次建图 假设缩点后的图是一条单链(回路,通路都能够)   则一定满足弱连通 推断是否是一条单链 能够依据建图过程中得到 入度 出度 数组进行推断 某点的入度 或 出度假设大于1则一定不是单链 另外单链仅仅能有一条  不能有多个点入度=0 代码: #

poj2762 Going from u to v or from v to u? --- 缩点+拓扑

给一个有向图,问是否该图上任意两点间可达. 首先容易想到缩点成有向无环图,其次就是如何处理任意两点间可达. 我在纸上画了一些情况: 4 3 1 2 2 3 2 4 4 4 1 2 1 3 2 4 3 4 3 3 1 2 2 3 1 3 7 8 1 2 1 3 3 4 2 4 4 5 4 6 5 7 6 7 5 6 1 2 1 3 2 3 3 4 3 5 4 5 NNYNY 根据这里一直在纠结如何通过入度出度直接判断.但是一直觉得不严谨.. 然后发现只要拓扑序列唯一即可.这样图中就没有 没有关系的

[POJ2762]Going from u to v or from v to u?

题目大意: 判断一个有向图是否弱连通. 思路: Tarjan缩点.然后判断原图是否是一条链. 考虑链的特性:有且仅有一点入度为0,有且仅有一点出度为0. 因此缩点后直接判断入度为0和出度为0的点的个数是否均为1即可. 1 #include<stack> 2 #include<cstdio> 3 #include<cctype> 4 #include<vector> 5 #include<cstring> 6 inline int getint()

[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? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14778   Accepted: 3911 Description In order to make their sons brave, Jiajia and Wind take them

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

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: 15196   Accepted: 4013 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

poj 2762 Going from u to v or from v to u? trajan+拓扑

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 thei

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

职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可能从一点到还有一点的. 代码例如以下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include

POJ 2762 Going from u to v or from v to u? (有向图求单连通性)

POJ 2762 Going from u to v or from v to u? 链接:http://poj.org/problem?id=2762 题意:为了让他们的儿子变得更勇敢些,Jiajia 和Wind 将他们带到一个大洞穴中.洞穴中有n 个房间,有一些单向的通道连接某些房间.每次,Wind 选择两个房间x 和y,要求他们的一个儿子从一个房间走到另一个房间,这个儿子可以从x 走到y,也可以从y 走到x.Wind 保证她布置的任务是可以完成的,但她确实不知道如何判断一个任务是否可以完成