自己做网站犯法吗,响应式布局什么意思,免费空间大全,网站站群 硬盘扩容 申请报告题目#xff1a;
上次Gardon的迷宫城堡小希玩了很久#xff08;见Problem B#xff09;#xff0c;现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样#xff0c;首先她认为所有的通道都应该是双向连通的#xff0c;就是说如果有一个通道连通了房间A和B
上次Gardon的迷宫城堡小希玩了很久见Problem B现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样首先她认为所有的通道都应该是双向连通的就是说如果有一个通道连通了房间A和B那么既可以通过它从房间A走到房间B也可以通过它从房间B走到房间A为了提高难度小希希望任意两个房间有且仅有一条路径可以相通除非走了回头路。小希现在把她的设计图给你让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子前两个是符合条件的但是最后一个却有两种方法从5到达8。 Input 输入包含多组数据每组数据是一个以0 0结尾的整数对列表表示了一条通道连接的两个房间的编号。房间的编号至少为1且不超过100000。每两组数据之间有一个空行。 整个文件以两个-1结尾。 Output 对于输入的每一组数据输出仅包括一行。如果该迷宫符合小希的思路那么输出Yes否则输出No。 Sample Input 6 8 5 3 5 2 6 4 5 6 0 0
8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0
3 8 6 8 6 4 5 3 5 6 5 2 0 0
-1 -1 Sample Output Yes Yes No
分析与解答 这题只要给了两个数就说明他们两个连结了那么如果他们的根结点相同那就形成了一个环然而题目要求任意两个房间有且仅有一条路径可以相通所以只要题目有环就不成立 而且这里迷宫是一个就是说不能有多个根节点出现那么由于我们初始化pre数组时候是每个pre[i]都等于i所以最后找的时候我们只找出现过的i的pre[i]是不是等于i就需要一个标记数组如果i出现过就标记为1否则为零。
参考代码 https://blog.csdn.net/mengxiang000000/article/details/50607030#commentsedit
#includestdio.h
#includeiostream
#includestring.h
using namespace std;
int ok;
int pre[100005];
int vis[100005];
int find(int x) //查找根节点
{ int rx;while ( pre[r] ! r ) //返回根节点 rrpre[r];int ix , j ;while( i ! r ) //路径压缩{j pre[ i ]; //j是i的原来的父结点 pre[ i ] r ; //现在把i的父结点改成根节点 ij; //再把j的父节点改成根节点 }return r ;
}
void join(int x,int y) //判断x y是否连通//如果已经连通就不用管了 如果不连通就把它们所在的连通分支合并起,
{int fxfind(x),fyfind(y);if(fx!fy)pre[fx ]fy;else ok0;
}
int main()
{int a,b;while(~scanf(%d%d,a,b)){if(a0b0){printf(Yes\n);continue;}for(int i0;i100005;i){pre[i]i;vis[i]0;}if(a-1b-1)break;join(a,b);ok1;vis[a]1;vis[b]1;while(scanf(%d%d,a,b)ab){join(a,b);vis[a]1;vis[b]1;}if(ok0){printf(No\n);continue;}else{int num0;for(int i0;i100005;i){if(vis[i]pre[i]i)num;}if(num1)printf(Yes\n);elseprintf(No\n);}}
}