这两个学校有一个特点:一个学校是男校,里面全是男生;另一个学校是女校,里面全是女生。 A 学校有 NN 个学生,其中有 PP 对朋友关系。B 学校有 MM 个学生,其中有 QQ 对朋友关系。朋友的朋友一定还是朋友。 每对朋友关系用两个整数 (X_i,Y_i)(X i ,Y i ) 组成,表示朋友的编号分别为 X_i,Y_iX i ,Y i 。男人的编号是正数,女人的编号是负数。小明的编号是 11,小红的编号是 -1−1。 大家都知道,小明和小红是朋友,那么,请你写一个
时间: 2023-11-28 22:47:19 浏览: 155
程序,判断小明和小红是否间接相连(即是否存在一个人,使得他与小明直接或间接相连,并且与小红直接或间接相连)。
思路:
我们可以将所有的朋友关系看作是一张图,其中每个人是一个节点,每对朋友关系是一条边。由于朋友的朋友也是朋友,所以这是一张无向图。我们可以利用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历这张图,找到小明和小红之间的路径。
具体实现时,我们可以将小明的编号设为起点,小红的编号设为终点,然后从起点开始进行搜索,每次将当前节点的所有未访问过的邻居节点加入队列中,直到找到终点或者队列为空为止。如果找到了终点,说明小明和小红之间存在一条路径,否则说明它们不连通。
代码实现:
```
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>
using namespace std;
bool isFriend(int x, int y, const vector<pair<int, int>>& friends) {
for (auto& f : friends) {
if ((f.first == x && f.second == y) || (f.first == y && f.second == x)) {
return true;
}
}
return false;
}
bool isLinked(int x, int y, const vector<pair<int, int>>& friends) {
unordered_set<int> visited;
queue<int> q;
q.push(x);
visited.insert(x);
while (!q.empty()) {
int curr = q.front();
q.pop();
if (curr == y) {
return true;
}
for (auto& f : friends) {
int next = -1;
if (f.first == curr) {
next = f.second;
} else if (f.second == curr) {
next = f.first;
} else {
continue;
}
if (visited.count(next) == 0) {
visited.insert(next);
q.push(next);
}
}
}
return false;
}
int main() {
int n, m, p, q;
cin >> n >> p;
vector<pair<int, int>> maleFriends, femaleFriends;
for (int i = 0; i < p; i++) {
int x, y;
cin >> x >> y;
if (x > 0 && y > 0) {
maleFriends.push_back({x, y});
} else if (x < 0 && y < 0) {
femaleFriends.push_back({-x, -y});
}
}
cin >> m >> q;
for (int i = 0; i < q; i++) {
int x, y;
cin >> x >> y;
if (x > 0 && y > 0) {
maleFriends.push_back({x, y});
} else if (x < 0 && y < 0) {
femaleFriends.push_back({-x, -y});
}
}
bool linked = isLinked(1, -1, maleFriends) || isLinked(1, -1, femaleFriends);
if (linked) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
```
阅读全文