网站开发界面设计用什么工具,深圳哪家网站建设好seo1888,wordpress 什么语言,wordpress动画插件下载地址目录
描述
输入
输出
样例输入
样例~~输出~~
思路
code 描述 Gardon的迷宫城堡小希玩了很久#xff08;见Problem B#xff09;#xff0c;现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样#xff0c;首先她认为所有的通道都应该是双向连通的…
目录
描述
输入
输出
样例输入
样例~~输出~~
思路
code 描述 Gardon的迷宫城堡小希玩了很久见Problem B现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样首先她认为所有的通道都应该是双向连通的就是说如果有一个通道连通了房间A和B那么既可以通过它从房间A走到房间B也可以通过它从房间B走到房间A为了提高难度小希希望任意两个房间有且仅有一条路径可以相通除非走了回头路。小希现在把她的设计图给你让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子前两个是符合条件的但是最后一个却有两种方法从5到达8。 输入 输入包含多组数据每组数据是一个以0 0结尾的整数对列表表示了一条通道连接的两个房间的编号。房间的编号至少为1且不超过100000。每两组数据之间有一个空行。 整个文件以两个-1结尾。 输出 对于输入的每一组数据输出仅包括一行。如果该迷宫符合小希的思路那么输出Yes否则输出No。 样例输入
6 8 5 3 5 2 6 4
5 6 0 08 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 03 8 6 8 6 4
5 3 5 6 5 2 0 0-1 -1样例输出
Yes
Yes
No思路 构成一个无向图判断这个图有没有回路也就是判断这个图是不是一棵树在输入阶段中我们要注意一个小细节一开始在输入“0 0”输出应该为Yes 判断无向图是否为一颗树两种方法 1、树的边数1节点数并且树一定没有环 2、并查集法若图中存在环必然存在一条边的两个点在判断他们所属的集合时会出现相等的情况 我们用第2种方法 code
#define _CRT_SECURE_NO_WARNINGS 1
#includeiostream
#includestring
#includealgorithm
#includeset
using namespace std;
const int N 1e5 10;
int pre[N], flag[N];//flag为房间是否访问过0代表没访问过1代表访问过
int find(int x) {return pre[x] x ? x : pre[x] find(pre[x]);
}
void merge(int x, int y) {pre[find(x)] find(y);
}
void init() {for (int i 0; i N; i) {pre[i] i;}
}
int main()
{int x, y;while (cin x y x ! -1) {if (!x !y) { //对一开始为0 0 输入要输出Yescout Yes endl;continue;}init();//初始化为将每个房间所在集合为自己的房间号memset(flag, 0, sizeof(flag));//cmemset头文件为stringflag[x] flag[y] 1;merge(x, y);int flag1 1;//标记是否存在回路if (x y) flag1 0;
//xy 代表两个房间为一个房间当前状态不合法
//如果一个房间自己相连则意味着有两条或两条以上的路径能够到达同一个房间while (cin x y x) {if (find(x) find(y))flag1 0;//存在回路flag[x] flag[y] 1;merge(x, y);}if (!flag1) { cout No endl; continue; }setint s;for (int i 1; i N; i) {if (!flag[i]) continue;s.insert(find(i));}cout ((int)s.size() 1 ? No : Yes) endl;}return 0;
}