교실 노트: 최소 생 성 트 리

최소 생 성 트 리 (minimal spanning tree) 생 성 트 리 의 대가: G = (V, E) 는 무방 향 연결 망 으로 트 리 의 각 변 의 값 을 생 성 하 는 것 을 이 생 성 트 리 의 대가 라 고 한다.최소 생 성 트 리: 그림 G 의 모든 생 성 트 리 중 대가 가 가장 적은 생 성 트 리 를 최소 생 성 트 리 라 고 합 니 다.MST (minimum spanning tree) 성질 가설 G = (V, E) 는 무방 향 연결 망 이 고 U 는 정점 집합 V 의 비공 식 서브 집합 이다.(u, v) 가 최소 가중치 가 있 는 변 이 라면 u * 8712 ° U, v * 8712 ° V - U 는 변 (u, v) 을 포함 하 는 최소 생 성 트 리 가 존재 합 니 다.MST 성질 의 응용 구조 최소 대가 생 성 트 리 두 가지 방법: Prime 법: 가산 점 법, Kruskal 방법: 가 변 법 Prim 알고리즘 기본 사상: 설정 G = (V, E) 는 n 개의 정점 을 가 진 연결 망 이 고 T = (U, TE) 은 G 의 최소 생 성 트 리 이 며 T 의 초기 상 태 는 U = {u0} (u0 * 8712 ° V), TE = {} 이 며 다음 작업 을 반복 합 니 다. 모든 u * 8712 ° U 에서v. 8712 ° V - U 의 변 에서 대가 가 가장 작은 변 (u, v) 을 찾 아 집합 TE 에 합병 하 는 동시에 v 는 U = V 까지 합병 합 니 다.데이터 구조 디자인 배열 lowcost [n]: 집합 V - U 의 각 정점 과 집합 U 의 정점 최 단 변 의 가중치 를 저장 하 는 데 사용 합 니 다. lowcost [v] = 0 은 정점 v 가 최소 생 성 트 리 에 추가 되 었 음 을 나타 냅 니 다.배열 adjvex [n]: 이 변 에 붙 어 있 는 (집합 V - U 의 각 정점 과 집합 U 의 가장 짧 은 변) 집합 U 의 정점 을 저장 합 니 다.Prim 알고리즘 - 의사 코드 1, 두 개의 보조 배열 lowcost (= arc [0] [i]) 와 adjvex (= 0) (0 은 시작 점) 를 초기 화 합 니 다.2. 출력 정점 u0, 정점 u0 을 집합 U 에 추가 합 니 다.3. 다음 작업 n - 1 회 3.1 을 반복 하고 lowcost 에서 가장 짧 은 변 (lowcost [k]) 을 선택 하여 해당 하 는 정점 번호 k 를 취한 다.3.2 출력 정점 k 와 대응 하 는 가중치;3.3. 정점 k 를 집합 U 에 넣는다 (lowcost [k] = 0).3.4 배열 lowcost 와 adjvex 를 조정 합 니 다.
Void prime(MGraph G){
          
	for(int i=1;i<G.vertexNu;i++){
              
		lowcost[i]=G.arc[0][i];  
		adjvex[i]=0;     
	}     
	lowcost[0]=0;
	for(i=1;i<G.vertexNum;i+++){
              
		k=MinEdge(lowcost,G.vertexNum)         
		cout<<K<<adjvex[k]<<lowcost[k];         
		lowcost[k]=0;
		for(j=1;j<G.vertexNum;j++)           
			if((G.arc[k][j]<lowcost[j]){
                    
				lowcost[j]=G.arc[k][j];               
				arcvex[j]=k;            
			}     
	} 
}

시간 복잡성: O (n2), 조밀도 에 적용.Kruskal 알고리즘 기본 사상: 1. 무방 향 연결 망 을 G = (V, E) 로 설정 하고 G 의 최소 생 성 트 리 를 T = (U, TE) 로 만 들 며 그 초 태 는 U = V, TE = {}, 2. 그리고 변 의 가중치 에 따라 작은 것 에서 큰 순서 로 G 의 변 집합 E 의 각 변 을 고찰 한다.2.1 고찰 된 변 의 두 정점 이 T 에 속 하 는 두 개의 서로 다른 연결 분량 이 라면 이 변 을 최소 생 성 트 리 의 변 으로 T 에 넣 고 두 개의 연결 분량 을 하나의 연결 분량 으로 연결한다.2.2 만약 에 고찰 된 변 의 두 정점 이 같은 연결 분량 에 속 하면 이 변 을 버 리 고 회 로 를 초래 하지 않도록 한다.3. 이렇게 하면 T 의 연결 분량 개수 가 1 일 때 이 연결 분량 은 G 의 최소 생 성 나무 입 니 다.Kruskal 알고리즘 사상 1. 초기 화: U = V;TE={ }; 2. T 의 연결 분량 개수 가 1. 2.1 일 때 까지 순환 하고 E 에서 가장 짧 은 변 (u, v) 을 찾 습 니 다.2.2 만약 에 정점 u, v 가 T 의 두 개의 서로 다른 연결 분량 에 있 으 면 2.2.1. 변 (u, v) 을 TE 에 합병 한다.2.2.2 이 두 개의 연결 분량 을 하나 로 합 친다.2.3. E 에 가장자리 (u, v) 를 표시 하여 (u, v) 후속 최 단 변 의 선택 에 참가 하지 않 게 한다.Kruskal 알고리즘 실현 중의 세 가지 관건 적 인 문제 1. 그림 의 저장 구 조 는 변 집합 배열 저장 도 를 사용한다.2. 한 변 에 붙 어 있 는 두 개의 정점 이 같은 연결 분량 에서 (집합 을 찾 아) Parent [i] 배열 을 정의 하 는 지 어떻게 판단 합 니까?배열 분량 의 값 은 정점 i 의 부모 노드 (초기 값 은 - 1;) 를 나타 낸다. 한 변 (u, v) 의 두 정점 의 뿌리 가 같 지 않 을 때 이 두 노드 는 서로 다른 연결 분량 에 속한다.어떻게 한 변 에 붙 어 있 는 두 개의 정점 을 같은 연결 분량 에 합 쳐 연결 분량 의 합병 을 진행 합 니까? 그 중에서 한 정점 이 있 는 나무의 뿌리 노드 는 vex 1 이 고 다른 정점 이 있 는 나무의 뿌리 노드 는 vex 2 입 니 다. 그러면 parent [vex 2] = vex 1 입 니 다.
int Find(int *parent, int node){
       
	int f;  
	f=node;  
	while(parent[f]>-1)   
		f=parent[f];  
	return f; 
}
int main(){
          
	int arcNum, int vertexNum;     
	EdgeNode *edge;     
	int *parent;
	cout<<"please input the number of vertexNum:"; 
	cin>>vertexNum;     
	cout<<"please input the number of edges:"; 
	cin>>arcNum;     
	edge=new EdgeNode[arcNum]; 
	parent=new int[vertexNum];
	for(int i=0;i<arcNum;i++){
        
		cout<<"Please input the edges:";  
		cin>>edge[i].from>>edge[i].to>>edge[i].weight;     
	}
	sort(edges, G);   
	for (i=0;i<vertexNum;i++)  
		parent[i]=-1;
	int k=0,begin,end,count=0;     
	cout<<"next is the MST :"<<endl;
	for (k=0;k<arcNum;k++){
               
		begin=edge[k].from; 
		end=edge[k].to;           
		int m,n;         
		m=Find(parent,begin); 
		n=Find(parent,end);         
		if(m!=n){
     
			cout<<begin<<","<<end<<","<<edge[k].weight<<endl;             
			parent[n]=m;              
			count++;             
			if(count==vertexNum-1) 
				break;        
		}    
	}    
	return 0; 
}

Kruskal 알고리즘 의 시간 복잡성 분석 변 집합 배열 정렬, 시간 복잡성 O (eloge), e 변 에서 변 을 선택 하고 시간 복잡성 은 O (e) 이 므 로 시간 복잡성 은 O (eloge) 이다.

좋은 웹페이지 즐겨찾기