hdu1272&&1325--并查集判环及森林问题

本文介绍了一种使用并查集判断图中是否存在环的方法,并提供了详细的代码实现。此外,还探讨了如何针对有向图进行调整以检测环的存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给一个图,如果图里有环或者是森林就输出"No"

注意空图算"Yes"

并查集判环:合并集合时,如果出现自己并自己的情况,就说明出现了环

1272:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int parent[maxn],ranc[maxn];
int serc(int pos)
{
    while(parent[pos]!=pos)
    {
        pos=parent[pos];
    }
    return pos;
}
void init()
{
    for(int i=0;i<=maxn;i++)
    {
        parent[i]=i;
        ranc[i]=1;
    }

}
void merg(int x,int y)
{
    x=serc(x);
    y=serc(y);
    if(ranc[x]<ranc[y])
    parent[x]=parent[y];
    else
    {
        if(ranc[x]==ranc[y])ranc[x]++;
        parent[y]=parent[x];
    }
}
void compress(int pos)
{
    int tpos=serc(pos);
    int cur;
    while(parent[pos]!=pos)
    {
        cur=parent[pos];
        parent[pos]=tpos;
        pos=cur;
    }
}

bool s[maxn];
int main()
{
    int t,m,n,cur1,cur2;
    bool flag;

    while(cin>>cur1>>cur2,cur1!=-1)
    {
        if(cur1==0&&cur2==0)
        {
            cout<<"Yes"<<endl;
        }
        else
        {
          memset(s,false,sizeof(s));
        flag=false;
        init();
        int maxn=0;
        if(cur1>maxn)maxn=cur1;
        if(cur2>maxn)maxn=cur2;
        s[cur1]=true;
        s[cur2]=true;
        if(serc(cur1)==serc(cur2))
            flag=true;
            merg(cur1,cur2);
        while(cin>>cur1>>cur2,cur1!=0)
        {
             s[cur1]=true;
        s[cur2]=true;
           if(serc(cur1)==serc(cur2))flag=true;
            merg(cur1,cur2);
            if(cur1>maxn)maxn=cur1;
        if(cur2>maxn)maxn=cur2;
        }


        int sum=0;
        if(!flag)
        for(int i=1;i<=maxn;i++)
        {
            if(parent[i]==i&&s[i]){if(sum==0)sum++;else{flag=true;break;}}
        }
        if(flag)cout<<"No"<<endl;
        else cout<<"Yes"<<endl;
        }

    }
    return 0;
}

1325把树搞成了有向边

只需要在上面那题代码里面加一个记录每个点有没有过双亲节点

//还有一点,输入结束标志是负数而不是-1 -1

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    int parent[maxn],ranc[maxn];
    bool hasparent[maxn];
    int serc(int pos)
    {
        while(parent[pos]!=pos)
        {
            pos=parent[pos];
        }
        return pos;
    }
    void init()
    {
        for(int i=0;i<=maxn;i++)
        {
            parent[i]=i;
            ranc[i]=1;
        }

    }
    void merg(int x,int y)
    {
        x=serc(x);
        y=serc(y);
        if(ranc[x]<ranc[y])
        parent[x]=parent[y];
        else
        {
            if(ranc[x]==ranc[y])ranc[x]++;
            parent[y]=parent[x];
        }
    }
    void compress(int pos)
    {
        int tpos=serc(pos);
        int cur;
        while(parent[pos]!=pos)
        {
            cur=parent[pos];
            parent[pos]=tpos;
            pos=cur;
        }
    }

    bool s[maxn];
    int main()
    {
        int t,m,n,cur1,cur2,ppp=0;
        bool flag;


        while(cin>>cur1>>cur2,cur1>=0)
        {
            if(cur1==0&&cur2==0)
            {
                cout<<"Case "<<++ppp<<" is a tree."<<endl;
            }
            else
            {
              memset(s,false,sizeof(s));
              memset(hasparent,false,sizeof(hasparent));
              hasparent[cur2]=true;
            flag=false;
            init();
            int maxn=0;
            if(cur1>maxn)maxn=cur1;
            if(cur2>maxn)maxn=cur2;
            s[cur1]=true;
            s[cur2]=true;
            if(serc(cur1)==serc(cur2))
                flag=true;
                merg(cur1,cur2);
            while(cin>>cur1>>cur2,cur1!=0)
            {
                if(!flag)
                {
                   if(hasparent[cur2]){flag=true;}
                hasparent[cur2]=true;
                 s[cur1]=true;
            s[cur2]=true;
               if(serc(cur1)==serc(cur2))flag=true;
                merg(cur1,cur2);
                if(cur1>maxn)maxn=cur1;
            if(cur2>maxn)maxn=cur2;
                }

            }


            int sum=0;
            if(!flag)
            for(int i=1;i<=maxn;i++)
            {
                if(parent[i]==i&&s[i]){if(sum==0)sum++;else{flag=true;break;}}
            }
            if(flag)cout<<"Case "<<++ppp<<" is not a tree."<<endl;
            else cout<<"Case "<<++ppp<<" is a tree."<<endl;
            }

        }
        return 0;
    }



出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值