모음 집 - 바이트 점프
8071 단어 프로 그래 밍 문제
그리고 전형 적 인 문 제 를 찾 아 보 자. 즉, 전체 그림 에 모두 몇 개의 연결 분기 2 차원 행렬 M 은 점 과 점 간 의 관 계 를 나타 낸다. 만약 에 M [i] [j] = 1 이 있 으 면 우 리 는 i 와 j 를 연결 할 수 있다. merge (int i, int j) 우 리 는 하나의 배열 pre [] 로 모든 점 의 전도 점 을 저장 할 수 있다. pre [i] = j 는 i 의 전도 점 이 j 임 을 나타 낸다.같은 연결 지점 에 속 하 는 점 을 서로 연결 시 키 기 위해 모든 연결 지점 에 하나의 메 인 노드 가 있다 고 가정 하고 선도 노드 는 그 자체 의 그 점 이 바로 메 인 노드 이다.이 연결 지점 에 속 하 는 모든 점 은 선도 점 을 통 해 이 메 인 노드 를 찾 을 수 있 습 니 다.우 리 는 함수 find 를 통 해 현재 노드 가 속 한 분기 의 주 노드 를 찾 을 수 있 습 니 다.
vector<int> pre;//
int find(int root) //
{
int son, tmp;
son = root;
while(root != pre[root]) //
root = pre[root];
while(son != root) //
{
tmp = pre[son];
pre[son] = root;
son = tmp;
}
return root;//
}
void merge(int x,int y)
{
pre[find(y)]=find(x);// x y
}
int findCircleNum(vector<vector<int>>& M)
{
int n=M.size();
pre.assign(n,0);
for(int i=0;i<n;++i)
pre[i]=i;//
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(M[i][j])
merge(i,j);// i,j
int ans=0;
for(int i=0;i<n;++i)
if(i==pre[i])//
++ans;
return ans;
}
그 중의 경로 압축 은 각 노드 의 전 도 를 찾 은 메 인 노드 로 설정 하 는 것 이다.이렇게 되면 경 로 를 찾 을 때마다 2 층 밖 에 없어 요.