洛谷 P2307 迷宫 并查集变形 未知点数和边数 多组输入处理

题目链接:

https://www.luogu.com.cn/problem/P2307

参考博客:

https://www.luogu.com.cn/blog/Zangiaju/post-shui-ti-ti-xie-p2307-mi-gong

算法:

并查集变形

难点:

1:与一般的并查集题目的区别在于,此题不知道具体的点数和边数,没办法知道一组数据什么时候结束

2:并且节点也不连续,例如1到8,缺少编号为1和5的节点

3:多组输入的处理

易错:

1:忽略题目上边的条件-----小希希望任意两个房间有且仅有一条路径可以相通--------不仅要保证在同一棵树中的两个节点不能再有边了,否则将形成环,还要保证最终只能形成一棵树,即,所有出现的节点必须具有相同的根节点,以保证任意两个房间有且仅有一条路径可以相通

思路:

1:注意,节点的编号不保证连续,所以用一个vis数组来记录有哪些节点出现过

2:用一个flag来标识每一组数据中是否已经出现了,在同一棵树中的两个节点是否又有了一条连接这两个节点的边,如果出现这种情况,直接把flag=1,等输入0 0表示一组输入完毕,调用chech()函数时,直接返回false,然后cout<<0即可,自己一开始是发现问题,就直接输出0,导致后边多余的数据没有办法解决。

3:如果没有出现上边的2这种情况,也不可以直接判断说,就符合题意,输出1,还要判断这些节点是否在同一棵树中,这也是导致80分的原因,即,是否有同一个根节点,如果发现根节点不止一个,即不是所有节点都在同一棵树中,那么就也返回false,只有当所有节点在同一棵树并且无环,才说明符合题意

inline bool check()
{
    int tmp=-1;
    if(flag==1)return false;
    else
    {
        for(int i=1;i<=maxn;i++)
        {
            if(tmp==-1&&vis[i]) tmp=get(i);
            else
                if(vis[i] && get(i)!=tmp) return false;
        }
    }
    return true;
}
#include <bits/stdc++.h>

using namespace std;
const int maxn=1e5+1;
int fa[maxn],vis[maxn],u,v;
bool flag;

inline void init()
{
    for(int i=1;i<=maxn;i++)fa[i]=i;
    memset(vis,0,sizeof(vis));
    flag=0;
}

inline int get(int x)
{
    return (fa[x]==x)?x:fa[x]=get(fa[x]);
}

inline void Merge(int x,int y)
{
    fa[get(x)]=get(y);
}

inline bool check()
{
    int tmp=-1;
    if(flag==1)return false;
    else
    {
        for(int i=1;i<=maxn;i++)
        {
            if(tmp==-1&&vis[i]) tmp=get(i);
            else
                if(vis[i] && get(i)!=tmp) return false;
        }
    }
    return true;
}

int main()
{
    ios::sync_with_stdio(0);
    init();
    while(cin>>u>>v)
    {
          if(u==0)
          {
              if(check())cout<<1;
              else cout<<0;
              init();
              cout<<endl;
              continue;
          }
          if(u==-1)return 0;
          if(get(u)!=get(v))
          {
              vis[u]=vis[v]=1;
              Merge(u,v);
          }
          else flag=1;
    }
    return 0;
}
发布了101 篇原创文章 · 获赞 19 · 访问量 5266

猜你喜欢

转载自blog.csdn.net/aiwo1376301646/article/details/104184281