亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? setmaxvertices.cpp

?? 普里母算法和克盧氏卡兒的關于求最短路徑的無向圖算法
?? CPP
字號:
#include <iostream>
#include <String>
#include <time.h>

using namespace std;
//#define	DEBUG //add by bighead
#define DEBUG_TIME
#define LOOPS  10000

#include "MinSpanTree.cpp"
#include "MinHeap.cpp"
#include "UFSets.cpp"
#include "SeqList.cpp"

const int MaxNumEdges = 50;//最大邊數

#ifndef SetMaxVertices
#define SetMaxVertices
const int MaxNumVertices=10;							//最大頂點數
#endif

//using std::istream;

template <class NameType, class DistType> class Graph {			//圖的類定義
private:
   SeqList<NameType> VerticesList;//( MaxNumVertices );			//頂點表
   DistType Edge[MaxNumVertices][MaxNumVertices];				//鄰接矩陣
   int CurrentEdges;											//當前邊數
   int FindVertex ( SeqList<NameType> & L, const NameType & vertex )
     { return L.Find (vertex); }     							//在頂點表L中搜索頂點vertex
   int GetVertexPos ( const NameType & vertex )
     { return FindVertex (VerticesList, vertex ); }
    //給出頂點vertex在圖中的位置
public:
   Graph ( const int sz=MaxNumEdges );									//構造函數
   int GraphEmpty ( ) const { return VerticesList.IsEmpty ( ); }		//判圖空否
   int GraphFull ( ) const { return VerticesList.IsFull ( ) || CurrentEdges ==MaxNumEdges; }
   int NumberOfVertices ( ) { return VerticesList.Length(); }			//返回當前頂點數
   int NumberOfEdges ( ) { return CurrentEdges; }						//返回當前邊數
   NameType GetValue ( const int i )									//取頂點i的值, i不合理則返回空
      { return VerticesList.Get(i); }
   DistType GetWeight ( const int v1, const int v2 );					//給出以頂點v1和v2為兩端點的邊上的權值
   int GetFirstNeighbor ( const int v );								//給出頂點位置為v的第一個鄰接頂點的位置
   int GetNextNeighbor ( const int v1, const int v2 );					//給出頂點位置v1的某鄰接頂點v2的下一個鄰接頂點
   void InsertVertex (  NameType & vertex );							//插入一個頂點vertex, 該頂點沒有入邊
   void InsertEdge ( const int v1, const int v2, DistType weight );		//插入一條邊(v1, v2), 該邊上的權值為weight
   void RemoveVertex ( const int v );									//在圖中刪去頂點vertex和所有與它相關聯的邊
   void RemoveEdge ( const int v1, const int v2 );						//在圖中刪去邊(v1,v2)
   void Prim ( MinSpanTree &T ) ;
   void Kruskal ( MinSpanTree &T );

   template <class NameType2, class DistType2> 
   friend istream& operator >>(istream&, Graph<NameType2, DistType2>& );
   template <class NameType2, class DistType2> 
   friend ostream& operator <<(ostream&, Graph<NameType2, DistType2>& );
};

template <class NameType, class DistType> Graph<NameType, DistType>::Graph ( 
const int sz ) {
//構造函數
   for ( int i=0; i<sz; i++ )					//鄰接矩陣初始化
	 for ( int j=0; j<sz; j++ ) Edge[i][j] = 0;
   CurrentEdges = 0;						//圖中當前邊數初始化
   #ifdef DEBUG
   		cout << "Graph construct!" << endl;
   #endif
};

template <class NameType, class DistType>
DistType Graph<NameType, DistType>::GetWeight ( const int v1, const int v2 )
{
//給出以頂點v1和v2為兩端點的邊上的權值
   if ( v1 != -1 && v2 != -1 ) return Edge[v1][v2];
   else return 0;							//帶權圖中權值為0, 表示無權值
};


template <class NameType, class DistType>
int Graph<NameType, DistType>::GetFirstNeighbor ( const int v ) {
//給出頂點位置為v的第一個鄰接頂點的位置, 如果找不到, 則函數返回-1。
   if ( v != -1 ) {
	 for ( int col=0; col<VerticesList.Length(); col++ ) 
	 	if ( Edge[v][col] > 0 ) return col;
   }
   return -1;
};

template <class NameType, class DistType>
int Graph<NameType, DistType>::GetNextNeighbor ( const int v1, const int v2 
) {
//給出頂點v1的某鄰接頂點v2的下一個鄰接頂點
   if ( v1 != -1 && v2 != -1 )
   {
     for ( int col=v2+1; col<VerticesList.Length(); col++ )
       if ( Edge[v1][col] > 0 ) return col;
   }
   return -1;
};

template <class NameType, class DistType>
void Graph<NameType, DistType>::InsertVertex (  NameType & vertex )		//插入一個頂點vertex, 該頂點沒有入邊
{
	assert (VerticesList.Insert ( vertex, VerticesList.Length() ));
};

template <class NameType, class DistType>
void Graph<NameType, DistType>:: InsertEdge ( const int v1, const int v2, 
DistType weight )	//插入一條邊(v1, v2), 該邊上的權值為weight
{
	CurrentEdges++;
	Edge[v1][v2]=weight;
	Edge[v2][v1]=weight;
};


template <class NameType,class DistType>
void Graph<NameType, DistType>::Prim ( MinSpanTree &T ) {
   int NumVertices = VerticesList.Length();				//圖中頂點數
   if (NumVertices<=0) return;
   int *lowcost,*nearvex;
   lowcost = new int[NumVertices];				//創建輔助數組
   nearvex = new int[NumVertices];				//創建輔助數組TV
   for ( int i=1; i<NumVertices; i++ ) 
   {
	 if (Edge[0][i]==0) 
	 	lowcost[i]=MAXINT; 
	 else 
	 	lowcost[i] = Edge[0][i];
	 	nearvex[i] = 0;		//頂點0到各邊的代價及最短帶權路徑
   }
   nearvex[0] = -1;							//頂點0加到生成樹頂點集合, 用-1表示

   for (int i=1; i<NumVertices; i++ ) 
   { //循環-1次, 加入n-1條邊
	 int min = MAXINT;  int v = 0;				//求生成樹外頂點到生成樹內頂點具有最小權值的邊
	 for ( int j=0; j<NumVertices; j++ )			//確定當前具最小權值的邊及頂點位置
	   if ( nearvex[j] != -1 && lowcost[j] < min ) 
	   { 
			v = j;  
			min = lowcost[j]; 
		}
	 if ( v )
	 {	// v==0表示再也找不到要求的頂點了
	   T.addEdge(nearvex[v],v,lowcost[v]);
	   nearvex[v] = -1;						//加入生成樹頂點集合
	   for (int j=1; j<NumVertices; j++ )
		 if ( (nearvex[j] != -1) && (Edge[v][j]!=0) && (Edge[v][j] < lowcost[j]) )
		   { 
				lowcost[j] = Edge[v][j];  
		   		nearvex[j] = v; 
			}		//修改
	 }
   }
};


template <class NameType, class DistType>
void Graph< NameType, DistType>::Kruskal ( MinSpanTree &T ) 
{												//克魯斯卡爾算法
   MSTEdgeNode e;
   MinHeap<MSTEdgeNode> H (CurrentEdges );		//最小堆
   int NumVertices = VerticesList.Length();		//圖中頂點個數
   #ifdef DEBUG
   		cout << "Kruskal is in use!" <<endl;
   #endif
   UFSets F (NumVertices);						//連通分量
   for ( int u=0; u<NumVertices; u++ ) 			//建立最小堆的數據
	 for ( int v=u+1; v<NumVertices; v++ )
	   if ( Edge[u][v] != 0 ) {					//插入新邊值結點到最小堆中
	   e.tail=u;e.head=v;e.key=Edge[u][v];
		 H.Insert (e);
	   }
   int count = 1;								//生成樹邊計數
   while ( count < NumVertices ) {				//反復執行, 取n-1條邊
	 H.RemoveMin (e );							//從最小堆中退出具最小權值的邊
	 int u = F.Find ( e.tail );
	 int v = F.Find ( e.head );					//取兩頂點所在集合的根
	 if ( u != v ) {							//不是同一集合, 說明不連通
	   F.Union ( u, v );
	   T.addEdge(e.tail,e.head,e.key);
	   count++;									//合并, 連通它們, 該邊加入生成樹
	 }
   }
};


template <class NameType, class DistType> 
istream& operator >>(istream& is, Graph<NameType,DistType>& g)
{
   int n,e,k,j;
   NameType head,tail,name;
   DistType weight;
   cout << "Input Vertices num = ";
   is >> n;										//輸入頂點個數
   cout << "Vertices Name = " << endl;
   for ( int i=0; i<n; i++)
   {
     is >> name;
     g.InsertVertex ( name );
   }											//依次輸入頂點, 插入圖中
	
   cout << "Input Edges num = ";	
   is >> e;										//輸入邊數
   cout << "Edge = <VerticsTail,VerticeHead,Weight>" << endl;
   for (int i=0; i<e; i++) {					//依次輸入邊信息
	 is >> tail >> head >> weight;				//輸入各邊
	 k = g.GetVertexPos ( tail );  
	 j = g.GetVertexPos ( head );				//取兩頂點位置
	 g.InsertEdge ( k, j, weight );				//插入圖中
   }
   return is;

}

template <class NameType, class DistType> 
ostream& operator <<(ostream& strm, Graph<NameType,DistType>& g)
{
	int	edgeNum,vecticesNum;
	edgeNum = g.NumberOfEdges();
	vecticesNum = g.NumberOfVertices();
	strm << "All the Vectics(" << vecticesNum << ") are below: <index,name>\n";
	for(int i=0;i < vecticesNum;i++)
		strm << i <<":"<<g.GetValue(i)<<"\t";
	strm << "\nAll the edges(" << edgeNum << ") are below:<head,tail,weight>\n";
	for(int i=0;i < vecticesNum;i++)
		for(int j=i+1;j < vecticesNum;j++)
			if(g.GetWeight(i,j) != 0)
				strm << "<" << i <<", "<<j<<", "<<g.GetWeight(i,j)<<">\t";
	return strm;
				
}
main()
{
	char p;
	#ifdef DEBUG_TIME
		clock_t start,end;
	#endif	
	int	times = 3;
	while(times)
	{
		cout << "\nPlease make your choice! 1, 2, 3 or 4" << endl;
		cout << "1:Demo 1 " << endl;
		cout << "2:Demo 2 " << endl;
		cout << "3:Construct the graph yourself! " <<endl;
		cout << "4:Quit " << endl;
		cout << "Type q or Q to exit!" << endl;
		cin >> &p;
		switch (p)
		{
			case '1':
				{
					cout << "\nChoice 1:This is in Demo 1 ! "<< endl;
					string iVetStr[7]={"0","1","2","3","4","5","6"};
					Graph<string,int> iGraph(7);
					for(int i=0;i<7;i++)
						iGraph.InsertVertex(iVetStr[i]);
					iGraph.InsertEdge(0,1,28);	
					iGraph.InsertEdge(0,5,10);
					iGraph.InsertEdge(1,2,16);
					iGraph.InsertEdge(1,6,14);
					iGraph.InsertEdge(2,3,12);
					iGraph.InsertEdge(3,4,22);
					iGraph.InsertEdge(3,6,18);
					iGraph.InsertEdge(4,6,24);
					iGraph.InsertEdge(5,4,25);	
					//display the graph
					cout << iGraph <<endl;
					#ifdef DEBUG_TIME
						start = clock();//t.start(); 
					#endif
					MinSpanTree	iMinSpanTreeK(iGraph.NumberOfVertices());
					iGraph.Kruskal(iMinSpanTreeK);
					for(int i=0;i < LOOPS;i++)
					{
						MinSpanTree	iMinSpanTreeK_tmp(iGraph.NumberOfVertices());
						iGraph.Kruskal(iMinSpanTreeK_tmp);
					}
					#ifdef DEBUG_TIME
						end = clock();
						cout << "start:" << start << " end:" << end << endl;
						cout << "Loops = " <<LOOPS<<" Kruskal Used Time: (ms) " << (end - start) << endl;  
					#endif
					cout<<iMinSpanTreeK<<endl;
				
					#ifdef DEBUG_TIME
						start = clock();//t.start();
					#endif
					MinSpanTree	iMinSpanTreeP(iGraph.NumberOfVertices());
					iGraph.Prim(iMinSpanTreeP);
					for(int i=0;i < LOOPS;i++)
					{
						MinSpanTree	iMinSpanTreeP_tmp(iGraph.NumberOfVertices());
						iGraph.Prim(iMinSpanTreeP_tmp);
					}
					#ifdef DEBUG_TIME
						end = clock();
						cout << "start:" << start << " end:" << end << endl;
						cout << "Loops = " <<LOOPS<<" Prim Used Time: (ms) " << (end - start) << endl; 
					#endif
					cout<<iMinSpanTreeP<<endl;
				}
				break;
				
			case '2':
				cout << "\nchoice 2:This is in Demo 2" << endl;
				{
					string iVetStr[9]={"A","B","C","D","E","F","G","H","I"};
					Graph<string,int> iGraph(9);
					for(int i=0;i<9;i++)
						iGraph.InsertVertex(iVetStr[i]);
					iGraph.InsertEdge(0,1,28);	
					iGraph.InsertEdge(0,5,10);
					iGraph.InsertEdge(1,2,16);
					iGraph.InsertEdge(1,6,14);
					iGraph.InsertEdge(2,3,12);
					iGraph.InsertEdge(3,4,22);
					iGraph.InsertEdge(3,6,18);
					iGraph.InsertEdge(4,6,24);
					iGraph.InsertEdge(5,4,25);	
					iGraph.InsertEdge(5,7,2);
					iGraph.InsertEdge(5,6,15);
					iGraph.InsertEdge(6,8,21);
					iGraph.InsertEdge(8,4,15);
					iGraph.InsertEdge(7,3,25);
					//display the graph
					cout << iGraph <<endl;
					#ifdef DEBUG_TIME
						start = clock();//t.start(); 
					#endif
					MinSpanTree	iMinSpanTreeK(iGraph.NumberOfVertices());
					iGraph.Kruskal(iMinSpanTreeK);
					for(int i=0;i < LOOPS;i++)
					{
						MinSpanTree	iMinSpanTreeK_tmp(iGraph.NumberOfVertices());
						iGraph.Kruskal(iMinSpanTreeK_tmp);
					}
					#ifdef DEBUG_TIME
						end = clock();
						cout << "start:" << start << " end:" << end << endl;
						cout << "Loops = " <<LOOPS<<" Kruskal Used Time: (ms) " << (end - start) << endl;  
					#endif
					cout<<iMinSpanTreeK<<endl;
				
					#ifdef DEBUG_TIME
						start = clock();//t.start();
					#endif
					MinSpanTree	iMinSpanTreeP(iGraph.NumberOfVertices());
					iGraph.Prim(iMinSpanTreeP);
					for(int i=0;i < LOOPS;i++)
					{
						MinSpanTree	iMinSpanTreeP_tmp(iGraph.NumberOfVertices());
						iGraph.Prim(iMinSpanTreeP_tmp);
					}
					#ifdef DEBUG_TIME
						end = clock();
						cout << "start:" << start << " end:" << end << endl;
						cout << "Loops = " <<LOOPS<<" Prim Used Time: (ms) " << (end - start) << endl; 
					#endif
					cout<<iMinSpanTreeP<<endl;
				}
				break;
				
			case '3':
				cout << "\nChoice 3:Construct the Graph yourself! "<<endl;
				{
					cout << "Begin MaxVertices = " << MaxNumVertices << endl;
					Graph<string,int> iGraph(MaxNumVertices);
					
					cin >> iGraph;
					cout << iGraph <<endl;	
					#ifdef DEBUG_TIME
						start = clock();
					#endif
					MinSpanTree	iMinSpanTreeK(MaxNumVertices);
					iGraph.Kruskal(iMinSpanTreeK);
					for(int i=0;i < LOOPS;i++)
					{
						MinSpanTree	iMinSpanTreeK_tmp(MaxNumVertices);
						iGraph.Kruskal(iMinSpanTreeK_tmp);
					}
					#ifdef DEBUG_TIME
						end = clock();
						cout << "start:" << start << " end:" << end << endl;
						cout << "Loops = " <<LOOPS<<" Kruskal Used Time: (ms) " << (end - start) << endl;  
					#endif
					cout<<iMinSpanTreeK<<endl;
					
					#ifdef DEBUG_TIME
						start = clock();
					#endif
					MinSpanTree	iMinSpanTreeP(MaxNumVertices);
					iGraph.Prim(iMinSpanTreeP);
					for(int i=0;i < LOOPS;i++)
					{
						MinSpanTree	iMinSpanTreeP_tmp(MaxNumVertices);
						iGraph.Prim(iMinSpanTreeP_tmp);
					}
					#ifdef DEBUG_TIME
						end = clock();
						cout << "start:" << start << " end:" << end << endl;
						cout << "Loops = " <<LOOPS<<" Prim Used Time: (ms) " << (end - start) << endl; 
					#endif
					cout<<iMinSpanTreeP<<endl;
				}
				break;
				
			case '4':
				return 1;
				break;
			
			case 'q':
				return 1;
				break;

			case 'Q':
				return 1;
				break;
								
			default:
				times--;
				cout << "\nare you kidding? Please input correctly! "<< times <<" times left!"<<endl;
				break;
		}
	}
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久久网| 亚洲国产精品高清| 2020国产精品久久精品美国| 国产精品传媒入口麻豆| 久久国产精品72免费观看| 欧美视频在线一区二区三区 | 粉嫩一区二区三区性色av| 色综合一个色综合亚洲| 精品成人在线观看| 亚洲成人久久影院| 91污在线观看| 国产三级精品视频| 秋霞电影一区二区| 欧美日韩一区二区不卡| 国产精品高潮呻吟| 大尺度一区二区| 欧美一级搡bbbb搡bbbb| 一区二区三区四区高清精品免费观看| 国产呦精品一区二区三区网站| 欧美狂野另类xxxxoooo| 亚洲精品欧美激情| 成a人片国产精品| 国产人伦精品一区二区| 激情综合色综合久久综合| 欧美日韩国产三级| 亚洲精品亚洲人成人网| 99久久精品国产导航| 亚洲国产成人在线| 成人av资源网站| 国产精品日韩精品欧美在线| 风流少妇一区二区| 国产拍揄自揄精品视频麻豆| 国产综合成人久久大片91| 欧美刺激午夜性久久久久久久| 日韩高清在线观看| 欧美一区二区三区播放老司机| 五月婷婷久久综合| 欧美日韩中文字幕一区| 亚洲国产综合人成综合网站| 欧美日韩国产综合草草| 日韩国产一区二| 日韩视频在线一区二区| 国精产品一区一区三区mba视频 | 美国毛片一区二区| 91精品久久久久久久91蜜桃| 日韩av电影天堂| 日韩美女一区二区三区| 麻豆精品蜜桃视频网站| 国产欧美一区二区三区网站| av不卡在线观看| 亚洲精品日韩综合观看成人91| 欧美色视频在线| 日本不卡一二三| 久久久久久亚洲综合影院红桃 | 中文字幕精品在线不卡| 成人精品小蝌蚪| 亚洲综合av网| 欧美一区二区视频观看视频| 国产一区二区主播在线| 亚洲丝袜自拍清纯另类| 欧美色手机在线观看| 国精品**一区二区三区在线蜜桃| 亚洲丝袜精品丝袜在线| 在线综合+亚洲+欧美中文字幕| 精品一区二区久久| 亚洲婷婷综合色高清在线| 欧美精品一二三区| 国产精品亚洲第一区在线暖暖韩国 | 91麻豆国产福利精品| 日韩中文字幕91| 国产亚洲精品资源在线26u| 日本韩国欧美一区二区三区| 日本不卡123| 亚洲精品成人精品456| 精品国产乱码久久久久久久久| 成人app网站| 另类成人小视频在线| 亚洲人午夜精品天堂一二香蕉| 欧美一区二区三区视频在线 | 激情都市一区二区| 一区二区久久久久久| 久久精品视频在线看| 欧美日韩一区二区在线观看| 丁香五精品蜜臀久久久久99网站| 日日夜夜免费精品视频| 亚洲欧美另类在线| 欧美国产日产图区| 26uuu精品一区二区在线观看| 在线观看av不卡| 99久久久精品免费观看国产蜜| 久久精品噜噜噜成人av农村| 亚洲午夜激情网站| 国产精品剧情在线亚洲| 精品欧美一区二区久久| 欧美日韩国产中文| 欧美色综合影院| 99久久精品免费看国产免费软件| 看片网站欧美日韩| 青青草91视频| 亚洲mv在线观看| 亚洲精品成人悠悠色影视| 综合久久久久久| 国产精品美日韩| 中文在线资源观看网站视频免费不卡| 日韩欧美另类在线| 日韩欧美国产综合在线一区二区三区| 欧美丰满少妇xxxxx高潮对白| 在线观看亚洲精品| 91电影在线观看| 欧美综合亚洲图片综合区| 91原创在线视频| 97久久精品人人澡人人爽| 成人做爰69片免费看网站| 国产精品综合网| 国产激情视频一区二区三区欧美 | 免费在线看一区| 蜜臀99久久精品久久久久久软件| 日韩激情av在线| 麻豆国产欧美一区二区三区| 理论电影国产精品| 国内成人精品2018免费看| 国产一区二区主播在线| 国产99久久久久| 99视频有精品| 欧美日韩综合在线免费观看| 欧美一区二区视频在线观看2022| 日韩视频永久免费| 久久午夜电影网| 国产精品高潮呻吟| 玉足女爽爽91| 丝袜美腿高跟呻吟高潮一区| 青草国产精品久久久久久| 国产一区二区精品久久| 99久久精品国产一区二区三区| 在线观看日韩精品| 欧美男生操女生| 久久―日本道色综合久久| 国产精品美女久久久久久久网站| 亚洲精品一二三区| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品亚洲а∨天堂免在线| 91麻豆视频网站| 91精品国产综合久久久蜜臀图片| 国产调教视频一区| 亚洲成人资源网| 国产精品正在播放| 在线观看亚洲a| 久久久久亚洲综合| 亚洲国产成人91porn| 久久99国产精品久久99| 丰满岳乱妇一区二区三区| 欧日韩精品视频| 久久精品亚洲精品国产欧美 | 国产一区二区三区免费播放| 99视频精品免费视频| 91精品国产综合久久久蜜臀图片 | av一区二区三区在线| 制服丝袜一区二区三区| 国产精品色婷婷久久58| 日韩电影免费一区| 9色porny自拍视频一区二区| 欧美色老头old∨ideo| 久久精品夜色噜噜亚洲aⅴ| 亚洲成人1区2区| 成人高清视频在线观看| 日韩精品一区二区三区视频| 亚洲一区自拍偷拍| 国产激情91久久精品导航| 欧美日韩一卡二卡三卡| 国产精品免费aⅴ片在线观看| 美女精品一区二区| 欧美日韩免费不卡视频一区二区三区| 国产欧美一区二区三区沐欲| 日韩精品成人一区二区三区| 色婷婷综合久久久| 国产精品网曝门| 国产露脸91国语对白| 欧美精品久久一区二区三区| 亚洲女同女同女同女同女同69| 国产精品亚洲午夜一区二区三区 | 亚洲女人****多毛耸耸8| 国产精品一区二区免费不卡| 日韩午夜精品视频| 亚洲中国最大av网站| 成人美女在线视频| 久久久久久久久久久久久女国产乱| 日韩国产欧美三级| 欧美视频你懂的| 亚洲国产日产av| 欧美性大战久久| 亚洲在线中文字幕| 色狠狠综合天天综合综合| 成人欧美一区二区三区1314| 成人一道本在线| 久久人人爽人人爽| 国产成人h网站| 国产欧美日韩精品一区| 国产a区久久久| 亚洲色图欧美在线| 色老汉一区二区三区|