poj 2762 Going from u to v or from v to u? (推断它是否是一个薄弱环节图)

poj 2762 Going from u to v or from v to u? (推断它是否是一个薄弱环节图)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

意甲冠军:给定一个有向图有m单向边缘。免费推断是否两点起来(a可以b要么b可以a或最多彼此),该请求

            弱联通重量。

算法:

缩点求强连通分量。然后又一次建图。推断新图是否是一条单链,即不能分叉,假设分叉了就会存在不可达的情况。

怎么推断是否是单链呢?

就是每次入度为0的点都仅仅有一个,即每次队列里仅仅有一个点。

poj 2762 Going from u to v or from v to u? (推断它是否是一个薄弱环节图)(    o(╯□╰)o。。。。

。好像已经是第二次用pair记录原图的点对,然后存pair的vector忘记清空导致wa来wa去!

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#define maxn 1010
#define maxm 20010

using namespace std;

struct node
{
    int to,next;
}edge[maxm],edge2[maxm];
int head[maxn],cnt,n;
int clk,top,s[maxn],scc,dfn[maxn],low[maxn],belong[maxn];
bool instack[maxn],vis[maxn];
int head2[maxn],cnt2,in[maxn];

typedef pair<int,int> PII;
vector<PII> xx;
queue<int> q;

void add(int x,int y)
{
    edge[cnt].to = y;
    edge[cnt].next = head[x];
    head[x] = cnt++;
}

void add2(int x,int y)
{
    edge2[cnt2].to = y;
    edge2[cnt2].next = head2[x];
    head2[x] = cnt2++;
}

void dfs(int x)
{
    dfn[x] = low[x] = clk++;
    s[top++] = x;
    instack[x] = true;
    for(int i=head[x];i!=-1;i = edge[i].next)
    {
        int u = edge[i].to;
        if(dfn[u]==-1)
        {
            dfs(u);
            low[x] = min(low[u],low[x]);
        }
        else if(instack[u])
        {
            low[x] = min(low[x],dfn[u]);
        }
    }
    if(low[x]==dfn[x])
    {
        int u;
        scc++;
        do
        {
            u = s[--top];
            instack[u]=false;
            belong[u] = scc;
        }while(u!=x);
    }
}

void tarjan()
{
    memset(dfn,-1,sizeof(dfn));
    memset(instack,0,sizeof(instack));
    memset(belong,0,sizeof(belong));
    clk = top = scc = 0;
    for(int i=1;i<=n;i++)
    {
        if(dfn[i]==-1)
            dfs(i);
    }
}

bool topo()
{
    memset(vis,0,sizeof(vis));
    int c = 0;
    while(!q.empty())
        q.pop();
    for(int i=1;i<=scc;i++)
    {
        if(!in[i])
        {
            c++;
            q.push(i);
        }
    }
    if(c>1) return false;
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        if(vis[u]) continue;
        vis[u] = true;
        c = 0;
        for(int i=head2[u];i!=-1;i=edge2[i].next)
        {
            int v = edge2[i].to;
            in[v]--;
            if(!in[v])
            {
                q.push(v);
                c++;
            }
        }
        if(c>1)
            return false;
    }
    return true;
}

int main()
{
    int m,a,b,T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        memset(in,0,sizeof(in));
        xx.clear();
        cnt = 0;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            xx.push_back(make_pair(a,b));
        }
        tarjan();
        memset(head2,-1,sizeof(head2));
        cnt2 = 0;
        for(int i=0;i<xx.size();i++)
        {
            int u = xx[i].first,v = xx[i].second;
            if(belong[u]!=belong[v])
            {
                add2(belong[u],belong[v]);
                in[belong[v]]++;
            }
        }
        if(topo()) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117526.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hashmap线程安全吗 什么解决方案_HashMap的底层实现原理

    hashmap线程安全吗 什么解决方案_HashMap的底层实现原理我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,应该使用ConcurrentHashMap,但是其线程不安全体现在什么地方,可能并没有深入理解,本文将对该问题进行解密。

    2025年7月1日
    0
  • java冒泡排序经典代码_Java 8大经典排序算法(含源代码),必须收藏!

    java冒泡排序经典代码_Java 8大经典排序算法(含源代码),必须收藏!原标题:Java8大经典排序算法(含源代码),必须收藏!今天小编帮大家整理了Java的8种经典算法。不论是笔试还是面试,都是非常实用的干货。不论你是菜鸟还是高手,非常值得一看!不转发也是挺可惜的~8种排序之间的关系:1,直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此…

    2022年7月9日
    17
  • django 模板_django动态模型字段

    django 模板_django动态模型字段变量模板中可以包含变量,Django在渲染模板的时候,可以传递变量对应的值过去进行替换。变量的命名规范和Python非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。

    2022年7月29日
    9
  • Java中的LinkedList的方法的应用

    Java中的LinkedList的方法的应用LinkedList其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:分配内存空间不是必须是连续的;插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);在Java中,LinkedList提供了丰富的方法,可以模拟链式队列,链式堆栈等数据结构,为用户带来了极大的方便,下面看看这些方法的用法:addboole

    2022年6月16日
    25
  • pycharm设置远程调试_调试助听器需要什么配置的电脑

    pycharm设置远程调试_调试助听器需要什么配置的电脑条件pycharm需要专业版方式使用远程解释器 使用远程调试器使用远程解释器默认情况下我们在本地开发Python程序时,使用的是本地的Python解释器,如果你安装了virtualenv或者pyenv的话,还可以选择这些虚拟环境。而使用Pycharm的专业版,则还可以选择使用远程Linux机器上的解释器。下面就来介绍下使用远程解释器的步骤。 远程部署配置远程部署主要用…

    2022年8月29日
    0
  • 理解es6中的暂时性死区

    理解es6中的暂时性死区作用域什么是作用域?一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。全局作用域JS中没有明确的全局作用域的概念,只有局部作用域以及全局执行环境的概念,全局执行环境被认为是window对象,是最外围的一个执行环境。因为作用域的概念只是给后续声明语句做一个铺垫,所以这里就不赘述了。局部作用域在外部无法访问局部作用域中的变量1、函数…

    2022年6月29日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号