任务日期:7.31
题目一链接: 108. 冗余连接 (kamacoder.com)
思路:从前到后遍历边,如果当前两个点不在一个集合就使他们加入到一个集合,构成树,如果位于一个集合则输出他们,因为如果把他们加入就会形成环
代码:
cpp
#include <bits/stdc++.h>
using namespace std;
std::vector<int> father(1010,0);//按照节点大小范围定义数组
int n;
void unit() {
for(int i = 0;i < n;i ++) {
father[i] = i;
}
}
int find(int u) {//寻找u的根节点
return u == father[u] ? u : find(father[u]);//压缩距离:递归到下一层
}
void joint(int u,int v) {
u = find(u);//这样节约空间不用重新定义新变量
v = find(v);
if(u == v) return;
else father[v] = u;
}
bool issame(int u,int v) {
u = find(u);
v = find(v);
return u == v;//bool函数可以返回true或者false
}
int main() {
cin>>n;
unit();
for(int i = 0;i < n;i ++) {
int s,t;
cin>>s>>t;
if(issame(s,t)) {//如果两个节点在一个集合
cout<<s<<" "<<t;
return 0;//从前往后找第一组符合条件的数据就是答案
}
else joint(s,t);//不在一个集合那么就使加入到一个集合以组成树
}
}
难点:
解释细节1:
题目二链接:
思路:
代码:
难点:
解释细节1:
题目三链接:
思路:
代码:
难点:
解释细节1: