核心思路:
class Solution {
public:
vector<int> findRedundantDirectedConnection(vector<vector<int>> edges){
int n=edges.size(); //给出的边数=结点数
int c=-1,l=-1; //c记录导致冲突的边的下标,l记录导致环路的边的下标
int parent[n+1];
int i;
for(i=1;i<=n;++i) //初始化,所有节点的祖先都是自己
parent[i]=i;
int u,v;
for(i=0;i<n;++i){
u=edges[i][0];
v=edges[i][1];
if(parent[v]!=v)
c=i;
else{
if(FindAncestor(u,parent)==FindAncestor(v,parent)) //判断是否导致回路,即在并查集(parent[])中查找祖先是否相同
l=i;
else
parent[v]=u;
}
} //遍历完edges
if(c==-1) return edges[l];
if(l==-1) return edges[c];
vector<int> re={parent[edges[c][1]],edges[c][1]};
return re;
}
int FindAncestor(int i,int parent[]){
if(parent[i]==i) return i;
else return FindAncestor(parent[i],parent);
}
};