这题主要就是点的数量不确定,另外如果图为空的话要输出YES
,而且这题数据里没有 边数 = 点数 - 1 的有环非连通图
(因为下面代码AC了),所以直接判断边和点的数量关系即可。
小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。
(19年5月8日)这题题意就是判断给定的图 是不是 (无向)无环连通图。“有”表示连通,“仅有”表示无环。
下面是无向图的四种情况。(总结)
无环连通图 | 有环连通图 | 无环非连通图(每一个连通分量都是无环的) | 有环非连通图(至少有一个连通分量是有环的) |
---|---|---|---|
边数 = 点数 - 1 | 边数 > 点数 - 1 | 边数 < 点数 - 1(点数 - 边数 = 连通分量数,且连通分量数 > 1) | 左边三种情况都有可能 |
上述表格描述的是性质,不能作为判定依据(因为有第四点存在)。只不过这道题钻了空子,因为前三点是互斥的,可以用来判定。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <unordered_set> // 不排序的set,仅有去重功能。需要额外头文件
using namespace std;
unordered_set<int> V; // 结点集
int Edges_cnt; // 边的数量
void init()
{
V.clear();
Edges_cnt = 0;
}
int main()
{
int a, b;
init();
for (; ~scanf("%d%d", &a, &b);)
{
if (a == -1) break;
if (a == 0)
{
if (Edges_cnt + 1 == V.size() || Edges_cnt == 0)
printf("Yes\n"); // 什么边都没有(图为空)也要输出Yes,否则会WA
else printf("No\n");
init();
continue;
}
Edges_cnt++;
V.insert(a);
V.insert(b);
}
return 0;
}