博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小希的迷宫 ----- 判断所给图中是否有环
阅读量:5998 次
发布时间:2019-06-20

本文共 1568 字,大约阅读时间需要 5 分钟。

题目要求 : 判断所给的图是否连同并且是否存在环    

并查集 做这一个题 实在是再好不过了 , 是否连同可以 看有几个顶点 , 是否存在环 , 看看 是否有一条边的 两个定点 的祖先节点 是一个点 . 下面附上渣渣代码 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 using namespace std;15 int father[100005],visited[100005],sum,flag;16 int find(int x) // 做了时间上的优化 ,但是 在空间复杂度上比较高17 {18 if(x!=father[x])19 father[x]=find(father[x]);20 sum++;21 return father[x];22 }23 void merge(int x,int y) // 做了时间复杂度上的优化 让并查集的 深度尽量 浅24 {25 int sum1,sum2;26 sum=0;27 x=find(x);28 sum1=sum; // x 的深度29 sum=0;30 y=find(y);31 sum2=sum; // y 的深度32 if(x!=y)33 {34 if(sum1>sum2)35 father[y]=x;36 else37 father[x]=y;38 }39 else40 flag=1; // 同一条边 的 两个父节点相同 , 则成环了41 }42 int main() // 所有的 房间应该还是 连通的43 {44 int n,m;45 while(scanf("%d%d",&n,&m)) // 不能 存在 环46 {47 flag=0;48 if(n==m&&n==-1)49 break;50 if(n==m&&n==0)51 {52 printf("Yes\n");53 continue;54 }55 for(int i=0;i<100005;i++)56 {57 father[i]=i; // i 的 爸爸 还是 i58 visited[i]=0; // 初始化 访问标记59 }60 visited[n]=visited[m]=1; // 这两个点 标记以访问61 merge(n,m); // 这个两个点 先构树62 while(scanf("%d%d",&n,&m))63 {64 if(n==m&&n==0)65 break;66 merge(n,m);67 visited[n]=visited[m]=1;68 }69 int count1=0;70 for(int i=0;i<100005;i++)71 {72 if(visited[i]&&father[i]==i)73 count1++;74 if(count1>1)75 {76 flag=1;77 break;78 }79 }80 if(flag)81 printf("No\n");82 else83 printf("Yes\n");84 }85 return 0;86 }

 

 

 

 

转载于:https://www.cnblogs.com/A-FM/p/5370423.html

你可能感兴趣的文章
iOS代码混淆----自动
查看>>
九九乘法表
查看>>
源码编译PHP7遇到的错误及解决方案
查看>>
IT运维分析与海量日志搜索需要注意什么
查看>>
yum仓库的创建
查看>>
howto dig
查看>>
关于linux-gpg数据加密详细配置
查看>>
学习FPGA绝佳网站推荐
查看>>
文件行去重
查看>>
Oracle的id自增长的两种方式
查看>>
我的友情链接
查看>>
oracle权限数据字典分析
查看>>
MYSQL-默认用户
查看>>
翻译是一份严谨的工作——关于HTTP中文翻译的讨论
查看>>
CentOS 6.7实战部署SSHKey
查看>>
设计模式学习笔记(3)——抽象工厂模式
查看>>
linux系统初始化--修改主机名
查看>>
初识JVM
查看>>
rsync服务同步、日志文件、screen工具
查看>>
我的友情链接
查看>>