<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      圖 克魯斯卡爾 Kruskal 算法生成最小生成樹/C++

      圖 克魯斯卡爾 Kruskal 算法生成最小生成樹

      基于尚硅谷韓老師java數(shù)據(jù)結(jié)構(gòu)課程
      本算法人為理解并不難,其實就是把所有的邊按照權(quán)值進行由小到大的排序,
      在把排序后的結(jié)果由小到大加起來,每加一次,進行回路判斷
      如果沒有回路就加,有回路就跳過,進行下一條邊。
      我們把主要的回路判斷算法放在此處。

      getEnds(int[],int)

      int getEnds(int ends[],int i){
      	while(ends[i]!=0){
      		i=ends[i];
      	}
      	return i;
      }
      

      韓老師說,兩個結(jié)點的終點不能一致,這里如何理解終點?
      就是開始生成最小生成樹的時候,沒加一條邊,都會有兩個頂點,其中每一個的頂點對應(yīng)一個終點
      從最小的邊開始加的時候,兩個頂點的終點都是"0",對應(yīng)的我們需要初始化一個全是0的數(shù)組ends[g->edges],長度為邊數(shù),讓每一個邊的終點此時的”終點“都對應(yīng)為 0,
      在我們每進行一次加邊的操作,我們再對這個數(shù)組進行更新。

      Kruskal(Graph ,Edges )

      void Kruskal(Graph g,Edges e){
      	int index=0;
      	int ends[g->edge]={0};//保存最小生成樹中每個頂點的終點 
      
      	//1.創(chuàng)建結(jié)果數(shù)組 ,保存最終的最小生成樹 Res 為Result的縮寫 
      	Edges edgeRes =(Edges) malloc(g->edge*sizeof(struct Edge));
      	
      	//2.按照邊的權(quán)值大小排序,我已經(jīng)在main里排序過了
      	
      	//3.遍歷edges數(shù)組從最小邊開始加,加一次判回路一次,沒回路就加進來(edgeRes),有回路就換下一條
      	
      	 for(int i =0;i<g->edge;i++) {
      	 	//拿到第i條邊的頂點的下標start 
      		int p1= getIndex(g,e[i].start);
      		//拿到第i條邊的頂點的下標start 
      		int p2= getIndex(g,e[i].end);
      		cout<<"p1 "<<p1<<"p2 "<<p2<<endl;
      		
      		//獲取p1頂點的在已有的最小生成樹中終點是?
      		int m =getEnds(ends,p1);
      		//獲取p2頂點的在已有的最小生成樹中終點是?
      		int n =getEnds(ends,p2);
      		cout<<"m "<<m<<"n "<<n<<endl;
      		for(int j=0;j<g->edge;j++)
      		cout<<ends[i];
      		cout<<endl;
      		//是否構(gòu)成回路
      		if(m!=n) {//不構(gòu)成回路 
      			ends[m] =n; //設(shè)置m 在已有最小生成樹的終點 
      			edgeRes[index++]=e[i];
      					}
      	 }
      	 //統(tǒng)計并打印最小生成樹
      	  for(int i =0;i<index;i++){
      	  	cout<<" "<<edgeRes[i].start<<" "<<edgeRes[i].end<<" "<<edgeRes[i].weight<<endl;
      	  }	
      }
      

      main()

      int main(){
      	int n;
      	cin>>n;
      	Graph graph=Create();
      	Edges edges;
      	edges=( Edges)malloc((n*(n-1)/2)*sizeof(struct Edge));
      	for(int i=0;i<n;i++){
      		char e;cin>>e;
      		addVex(graph,e);
      	}
      		
      	E v1,v2;int w;
      	while(cin>>v1>>v2){
      		cin>>w;
      		addEdge(graph,v1,v2,w,edges);
      	}
      
      	cout<<"第一次"<<endl;
      	printMatrix(graph,edges);
      	qsort(edges,graph->edge, sizeof(Edge), cmp);
      	cout<<"庫魯斯卡爾:"<<endl; 
      	Kruskal(graph,edges);
      	cout<<"排序后"<<endl;
      	printMatrix(graph,edges);
      	
      }
      

      整體

        #include<iostream> 
      #define MAX 10
      #include<malloc.h>
      #include<string.h>
      #include<stdlib.h>
      using namespace std;
      typedef char E;
      typedef struct Edge{
      	E start;
      	E end;
      	int weight;
      }*Edges;
      typedef struct GraphMatrix{
      	int vex,edge;
      	int matrix[MAX][MAX];
      	E data[MAX];
      }*Graph;
      
      Graph Create(){
      	Graph g = (Graph)malloc(sizeof(GraphMatrix));
      	g->vex=g->edge=0;
      	memset(g->matrix,0,sizeof(g->matrix));
      	return g;
      }
      void addVex(Graph g,E e){
      	g->data[g->vex++]=e;
      	
      }
      int getIndex(Graph g,E e){
      	for(int i=0;i<g->vex;i++)
      		if(g->data[i]==e)
      			return i;
      	return -1;
      }
      void addEdge(Graph g,E v1,E v2,int w,Edges e){
      	int a=getIndex(g,v1);
      	int b=getIndex(g,v2);
      	g->matrix[a][b]=w;
      	g->matrix[b][a]=w;
      	
      	e[g->edge].start=v1;
      	e[g->edge].end=v2;
      	e[g->edge].weight=w;
      
      	g->edge++;
      }
      printMatrix(Graph g,struct Edge e[]){
      	for(int i=0;i<g->vex;i++)
      	{
      		for(int j=0;j<g->vex;j++)
      		 cout<<"\t"<<g->matrix[i][j];
      		cout<<endl;
      	}
      	for(int i=0;i<g->edge;i++)
      	 cout<<" "<<e[i].start<<" "<<e[i].end<<" "<<e[i].weight<<endl;
      }
      void Kruscal(Graph g){
      	int vLen=g->vex;
      }
      int getEnds(int ends[],int i){
      	while(ends[i]!=0){
      		i=ends[i];
      	}
      	return i;
      }
      void Kruskal(Graph g,Edges e){
      	int index=0;
      	int ends[g->edge]={0};//保存最小生成樹中每個頂點的終點 
      	
      	//創(chuàng)建結(jié)果數(shù)組 ,保存最終的最小生成樹 Res 為Result的縮寫 
      	Edges edgeRes =(Edges) malloc(g->edge*sizeof(struct Edge));
      	
      	//按照邊的權(quán)值大小排序,我已經(jīng)在main里排序過了
      	
      	//遍歷edges數(shù)組從最小邊開始加,加一次判回路一次,沒回路就加進來(edgeRes),有回路就換下一條
      	
      	 for(int i =0;i<g->edge;i++) {
      	 	//拿到第i條邊的頂點的下標start 
      		int p1= getIndex(g,e[i].start);
      		//拿到第i條邊的頂點的下標start 
      		int p2= getIndex(g,e[i].end);
      		cout<<"p1 "<<p1<<"p2 "<<p2<<endl;
      		
      		//獲取p1頂點的在已有的最小生成樹中終點是?
      		int m =getEnds(ends,p1);
      		//獲取p2頂點的在已有的最小生成樹中終點是?
      		int n =getEnds(ends,p2);
      		cout<<"m "<<m<<"n "<<n<<endl;
      		for(int j=0;j<g->edge;j++)
      		cout<<ends[i];
      		cout<<endl;
      		//是否構(gòu)成回路
      		if(m!=n) {//不構(gòu)成回路 
      			ends[m] =n; //設(shè)置m 在已有最小生成樹的終點 
      			edgeRes[index++]=e[i];
      			cout<<"index "<<index<<endl;
      		}
      	 }
      	 //統(tǒng)計并打印最小生成樹
      	  for(int i =0;i<index;i++){
      	  	cout<<" "<<edgeRes[i].start<<" "<<edgeRes[i].end<<" "<<edgeRes[i].weight<<endl;
      	  }
      	
      	
      }
      int cmp(const void *a, const void *b){
          return ((struct Edge *)a)->weight - ((struct Edge *)b)->weight;
      }
      
      
      
      
      int main(){
      
      	int n;
      	cin>>n;
      	Graph graph=Create();
      	Edges edges;
      	edges=( Edges)malloc((n*(n-1)/2)*sizeof(struct Edge));
      	for(int i=0;i<n;i++){
      		char e;cin>>e;
      		addVex(graph,e);
      	}
      		
      	E v1,v2;int w;
      	while(cin>>v1>>v2){
      		cin>>w;
      		addEdge(graph,v1,v2,w,edges);
      	}
      
      	cout<<"第一次"<<endl;
      	printMatrix(graph,edges);
      
      	qsort(edges,graph->edge, sizeof(Edge), cmp);
      	cout<<"庫魯斯卡爾:"<<endl; 
      	Kruskal(graph,edges);
      	cout<<"排序后"<<endl;
      	printMatrix(graph,edges);
      	
      	
      }
      
      posted @ 2023-12-21 12:44  Happy_Eric  閱讀(66)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99久久精品久久久久久婷婷| 色综合色综合久久综合频道 | 国内精品无码一区二区三区| 久久精品人人做人人爽电影蜜月| 色丁香一区二区黑人巨大| 一区二区三区四区五区自拍| 国产熟女50岁一区二区| 韩国av无码| 欧美交a欧美精品喷水| 国产精品一区二区在线蜜芽tv| 国产乱子伦视频在线播放| 又大又紧又粉嫩18p少妇| 水蜜桃视频在线观看免费18| 亚洲精品一区三区三区在| 亚洲18禁一区二区三区| 久久天天躁狠狠躁夜夜avapp| 婷婷综合亚洲| 亚洲国产成人无码AV在线影院L| 99久re热视频这里只有精品6| 国产视频一区二区三区四区视频| 日韩久久久久久中文人妻| 国产av无码专区亚洲av软件| 国产怡春院无码一区二区| 国产精品国产三级国产a| 99国产精品欧美一区二区三区| 久久99久国产精品66| 亚洲国产成人久久精品app| 国产中文三级全黄| 国产精品一区二区三区专区| 亚欧洲乱码视频在线专区| 偷窥少妇久久久久久久久| 人妻少妇无码精品专区| 始兴县| av午夜福利一片免费看久久| 免费无码AV一区二区波多野结衣| 千阳县| 欧美成人午夜精品免费福利| 亚洲午夜理论无码电影| 平顺县| 国产亚洲精品第一综合| 国产成人精品免费视频app软件|