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

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

?? adjlist.h

?? 普里姆算法求最小生成樹(鄰接表存儲)
?? H
字號:
//用結構體定義鄰接表中邊的信息
struct Edge
{
	int dist;//下標
	WType weight;//權值
	Edge *next;//指向下一個領接邊的指針
	Edge(){};
	Edge(int n,WType w)//構造函數
	{
		dist=n;
		weight=w;
		next=NULL;
	}
};
//定義結點信息
struct VerticeType
{
	VerType data;//結點內容
	Edge*firstAdj;//第一條鄰接邊
};
class AdjList
{
private:	
	VerticeType Vertice[MaxNode];//MaxNode為定義的最大結點數
	int numOfVertice;//結點數目
	int numOfEdge;//邊數
	int typeFlag;//區分有向圖還是無向圖,定義0為無向圖,1 為有向圖
public:
	AdjList(int flag=0);//構造函數
	~AdjList(void);//析構函數
	int AdjListEmpty()//鄰接表判空
	{
		return (numOfVertice==0);
	}
	int AdjListFull()//鄰接表判滿
	{
		return(numOfVertice==MaxNode);
	}
	int NumOfVer()
	{
		return numOfVertice;
	}
	int NumOfEdge()
	{
		return numOfEdge;
	}
	VerType GetItem(const int i);//獲取序號為i的結點內容
	WType GetWeight(int v1,int v2);//獲取邊<v1,v2>的權
	void InsertVertice(VerType item);//插入一個結點
	void InsertEdge(int v1,int v2,WType w);//插入邊<v1,v2>權值為w
	void DeleteVertice(int v);//刪除下標為v的結點
	void DeleteEdge(int v1,int v2);//刪除邊<v1,v2>
	int GetFirstNeighbor(const int v);//返回結點v第一條相鄰邊的下標,無相鄰邊返回-1
	int GetNextNeighbor(const int v1,const int v2);//返回結點v1除了<v1,v2>下一條鄰接邊的結點下標,無則返回-1
	void DepthFirstSearch(const int v,int visited[],void visit(VerType item));//從結點v開始深度優先遍歷連通圖
	void BroadFirstSearch(const int v,int visited[],void visit(VerType item));//從結點v開始廣度優先遍歷連通圖
	void DepthFirstSearch(void visit(VerType item));//從結點v開始深度優先遍歷非連通圖
	void BroadFirstSearch(void visit(VerType item));//從結點v開始廣度優先遍歷非連通圖
	Edge*GetAdj(int v);//獲得指向序號v的結點的第一鄰接邊的指針
	
};
AdjList::AdjList(int flag)
{
	typeFlag=flag;
	for(int i=0;i<MaxNode;i++)
		Vertice[i].firstAdj=NULL;
	numOfVertice=0;
	numOfEdge=0;
}
AdjList::~AdjList(void)
{
	for(int i=0;i<numOfVertice;i++)
	{
		Edge*p,*q;
		p=Vertice[i].firstAdj;
		while(p)
		{
			q=p->next;
			delete p;
			p=q;
		}
	}
}
VerType AdjList:: GetItem(const int i)//獲取序號為i的結點內容
	{
		if (i<0||i>=numOfVertice)
		{
			cout<<"結點序號i有誤!";
			exit(0);
		}
		return Vertice[i].data;
	}
	WType AdjList:: GetWeight(int v1,int v2)//獲取邊<v1,v2>的權
	{
		if(v1<0||v1>=numOfVertice||v2<0||v2>=numOfVertice)
		{
			cout<<"v1和v2的值不合法,無法找到邊<v1,v2>的權";
				exit(0);
		}
		Edge*first;
		first=Vertice[v1].firstAdj;
		while(first->next!=NULL && first->dist!=v2)
		{
			first=first->next;
		}
		if(first->dist==v2)
			return first->weight;
		else
		{
			cout<<"邊<v1,v2>的權不存在";
			exit(0);
		}
	}
void AdjList::InsertVertice(VerType item)
{
	if(AdjListFull())
	{
		cout<<"鄰接表已滿,無法插入新的頂點";
		exit(0);
	}
	Vertice[numOfVertice++].data=item;
}
void AdjList::InsertEdge(int v1,int v2,WType w)
{
	if(v1<0||v1>=numOfVertice||v2<0||v2>=numOfVertice)
		{
			cout<<"v1和v2的值不合法,無法插入邊<v1,v2>";
				exit(0);
		}
	Edge*p;
	if(!typeFlag)//無向圖
	{
		p=new Edge(v2,w);//插入邊(v1,v2)
		if(Vertice[v1].firstAdj==NULL)//第一次插入
			Vertice[v1].firstAdj=p;
		else
		{	
			Edge*curr=Vertice[v1].firstAdj,*pre=NULL;
			while(curr!=NULL&&curr->dist<v2)
			{
				pre=curr;
				curr=curr->next;
			}
			if(pre==NULL)//插在第一個結點之后
			{
				p->next=Vertice[v1].firstAdj;
				Vertice[v1].firstAdj=p;
			}
			else//插在pre之后
			{
				p->next=pre->next;
				pre->next=p;
			}
		}
		p=new Edge(v1,w);//插入邊(v2,v1)
		if(Vertice[v2].firstAdj==NULL)//第一次插入
			Vertice[v2].firstAdj=p;
		else
		{	
			Edge*curr=Vertice[v2].firstAdj,*pre=NULL;
			while(curr!=NULL&&curr->dist<v1)
			{
				pre=curr;
				curr=curr->next;
			}
			if(pre==NULL)//插在第一個結點之后
			{
				p->next=Vertice[v2].firstAdj;
				Vertice[v2].firstAdj=p;
			}
			else//插在pre之后
			{
				p->next=pre->next;
				pre->next=p;
			}
		}

		numOfEdge++;

	}
	else//有向圖
	{
		 p=new Edge(v2,w);//插入邊<v1,v2>
		if(Vertice[v1].firstAdj==NULL)//第一次插入
			Vertice[v1].firstAdj=p;
		else
		{	
			Edge*curr=Vertice[v1].firstAdj,*pre=NULL;
			while(curr!=NULL&&curr->dist<v2)
			{
				pre=curr;
				curr=curr->next;
			}
			if(pre==NULL)//插在第一個結點之后
			{
				p->next=Vertice[v1].firstAdj;
				Vertice[v1].firstAdj=p;
			}
			else//插在pre之后
			{
				p->next=pre->next;
				pre->next=p;
			}
		}
		numOfEdge++;
	}
}
void AdjList::DeleteVertice(int v)
{
	if (v<0||v>=numOfVertice)
		{
			cout<<"序號為v的結點不存在,無法刪除!";
			exit(0);
		}
		//刪除鄰接表中其它頂點與v的關聯邊
	Edge*p,*q;
	p=Vertice[v].firstAdj;//刪除v結點關聯的邊
	for(int i=v;i<numOfVertice-1;i++)//刪除結點
	{
		Vertice[i].data=Vertice[i+1].data;
		Vertice[i].firstAdj=Vertice[i+1].firstAdj;
	}
	numOfVertice--;
	while(p!=NULL)
	{
		numOfEdge--;
		q=p->next;
		delete p;
		p=q;
	}
	//刪除包含頂點vv的邊,需要注意的是原有鄰接邊的序號發生改變
	//即所有鄰接邊序號中比貝刪除結點序號大的都要減去1
	Edge*temp;
    for(int j=0;j<numOfVertice;j++)
	{
		p=Vertice[j].firstAdj;
		q=NULL;
		while(p!=NULL&&p->dist<v)
		{
			q=p;
			p=p->next;
		}
		if(q==NULL&&p->dist==v)//刪除的是第一個鄰接邊
		{
			Vertice[j].firstAdj=p->next;
			delete p;
			if(typeFlag)
				numOfEdge--;
		}
		else if(p!=NULL&&p->dist==v)
		{
			q->next=p->next;
			delete p;
			if(typeFlag)
				numOfEdge--;
		}
	}
	for(j=0;j<numOfVertice;j++)
		{
			p=Vertice[j].firstAdj;
			q=NULL;
			while(p!=NULL&&p->dist<=v)
			{
				q=p;
				p=p->next;
			}
			if(p!=NULL)
			{
				temp=p;
				while(temp!=NULL)
				{
					temp->dist--;
					temp=temp->next;
				}
			}
	}
}
void AdjList::DeleteEdge(int v1,int v2)
{
	if(v1<0||v1>=numOfVertice||v2<0||v2>=numOfVertice)
		{
			cout<<"v1和v2的值不合法,無法刪除邊<v1,v2>";
				exit(0);
		}
	if(typeFlag)//有向圖刪除邊<v1,v2>
	{
		Edge*p,*q;
		q=NULL;
		p=Vertice[v1].firstAdj;
		while(p&&p->dist!=v2)
		{
			q=p;
			p=p->next;
		}
		if(q==NULL&&p->dist==v2)//刪除第一個結點
		{
			Vertice[v1].firstAdj=p->next;
			delete p;
				numOfEdge--;
		}
		if(q!=NULL&&p->dist==v2)//刪除p
		{
			q->next=p->next;
			delete p;
			numOfEdge--;
		}
	}
	else//無向圖
	{
		Edge*p,*q;
		q=NULL;
		p=Vertice[v1].firstAdj;//刪除邊(v1,v2)
		while(p&&p->dist!=v2)
		{
			q=p;
			p=p->next;
		}
		if(q==NULL&&p->dist==v2)
		{
			Vertice[v1].firstAdj=p->next;
			delete p;
		}
		if(q!=NULL&&p->dist==v2)
		{
			q->next=p->next;
			delete p;
		}
		numOfEdge--;
		q=NULL;
		p=Vertice[v2].firstAdj;//刪除邊(v2,v1)
		while(p&&p->dist!=v1)
		{
			q=p;
			p=p->next;
		}
		if(q==NULL&&p->dist==v1)
		{
			Vertice[v2].firstAdj=p->next;
			delete p;
		}
		if(q!=NULL&&p->dist==v1)
		{
			q->next=p->next;
			delete p;
		}
	}
}
int AdjList::GetFirstNeighbor(const int v)
{
	if (v<0||v>=numOfVertice)
		{
			cout<<"序號為v的結點不存在,無法找到他的第一條鄰接邊!";
			exit(0);
		}
	Edge*p=Vertice[v].firstAdj;
	if(p)
		return p->dist;
	return -1;
}
int AdjList::GetNextNeighbor(const int v1,const int v2)
{
	if(v1<0||v1>=numOfVertice||v2<0||v2>=numOfVertice)
		{
			cout<<"v1和v2的值不合法,無法找到<v1,v2>的下一鄰接邊";
				exit(0);
		}
	Edge*p=Vertice[v1].firstAdj;
	while (p)
	{
		if(p->next&&p->dist==v2)
			return p->next ->dist ;
		else
			p=p->next ;
	}
	return -1;
}
void AdjList::DepthFirstSearch(const int v,int visited[],void visit(VerType item))
{
	visit(GetItem(v));
	visited[v]=1;//作標記,表示該點已經訪問過了
	int adjV=GetFirstNeighbor(v);
	while(adjV!=-1)
	{
		if(!visited[adjV])
			DepthFirstSearch(adjV,visited,visit);//以adjV點進行深度優先遍歷
		adjV=GetNextNeighbor(v,adjV);
	}
}
void AdjList::BroadFirstSearch(const int v,int visited[],void visit(VerType item))
{
	int u,adjV;
	SeqQueue queue;
	visit(GetItem(v));
	visited[v]=1;
	queue.QInsert(v);
	while(!queue.QueueEmpty())
	{
		u=queue.QDelete();
		adjV=GetFirstNeighbor(u);
		while(adjV!=-1)
		{
			if(!visited[adjV])
			{
				visit(GetItem(adjV));
				visited[adjV]=1;
				queue.QInsert(adjV);
			}
			adjV=GetNextNeighbor(u,adjV);
		}
	}
}
void AdjList::DepthFirstSearch(void visit(VerType item))//有向圖和非連通圖深度優先遍歷
{
	int *visited=new int[NumOfVer()];
	for(int i=0;i<NumOfVer();i++)
		visited[i]=0;
	for(i=0;i<NumOfVer();i++)
		if(!visited[i])
			DepthFirstSearch(i,visited,visit);
		delete []visited;
}
void AdjList:: BroadFirstSearch(void visit(VerType item))//有向圖和非連通圖廣度優先遍歷
{
	int *visited=new int[NumOfVer()];
	for(int i=0;i<NumOfVer();i++)
		visited[i]=0;
	for(i=0;i<NumOfVer();i++)
		if(!visited[i])
			BroadFirstSearch(i,visited,visit);
		delete []visited;
}
Edge* AdjList::GetAdj(int v)
{
	if (v<0||v>=numOfVertice)
		{
			cout<<"序號為v的結點不存在,無法找到指向他的第一條鄰接邊的指針!";
			exit(0);
		}
	Edge*p=Vertice[v].firstAdj;
	return p;
}





		






















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀99久久精品久久久久久软件| 五月婷婷欧美视频| 欧美日韩一区二区三区在线看| 九九热在线视频观看这里只有精品| 国产精品超碰97尤物18| 日韩一区二区视频| 在线亚洲一区二区| 国产成人av网站| 日韩黄色一级片| 亚洲精品免费播放| 国产三级一区二区三区| 91精品国产麻豆| 欧美亚洲综合久久| 成人一区二区三区在线观看 | 天天影视网天天综合色在线播放| 国产视频一区不卡| 精品卡一卡二卡三卡四在线| 91福利精品视频| av不卡免费在线观看| 国产精品资源在线观看| 毛片基地黄久久久久久天堂| 亚洲已满18点击进入久久| 国产精品久久久久久久午夜片 | 国产精品福利一区二区| 精品国产乱码久久久久久牛牛| 欧美日韩视频在线第一区| 91亚洲资源网| a亚洲天堂av| 成人性生交大片免费看视频在线| 国内精品不卡在线| 日韩不卡一区二区三区 | 天天综合网 天天综合色| 亚洲天堂免费在线观看视频| 国产日韩欧美激情| 久久精品亚洲麻豆av一区二区 | 亚洲精品videosex极品| 中文字幕制服丝袜一区二区三区 | 奇米在线7777在线精品| 亚洲a一区二区| 亚洲高清免费视频| 亚洲大片在线观看| 五月激情综合色| 天天色天天爱天天射综合| 99久久婷婷国产综合精品电影| 精品在线免费视频| 久久爱www久久做| 激情久久五月天| 国模无码大尺度一区二区三区| 蜜臀久久久99精品久久久久久| 日本不卡123| 美女精品自拍一二三四| 麻豆精品精品国产自在97香蕉| 蜜桃视频第一区免费观看| 美女国产一区二区三区| 激情综合网av| 成人午夜免费av| 91亚洲大成网污www| 一本到不卡免费一区二区| 色美美综合视频| 欧美日韩和欧美的一区二区| 91精品国产aⅴ一区二区| 日韩欧美国产综合| 日本一区二区在线不卡| 日韩美女啊v在线免费观看| 亚洲午夜电影在线观看| 日韩1区2区3区| 国产一区二区三区四区五区入口 | 国产麻豆91精品| 白白色亚洲国产精品| 欧美视频一区在线| 日韩欧美亚洲一区二区| 国产日韩欧美不卡| 一区二区三区四区不卡在线| 日韩中文字幕一区二区三区| 国产一区中文字幕| av在线不卡电影| 在线观看91av| 国产日韩欧美a| 亚洲一区二区三区中文字幕| 另类综合日韩欧美亚洲| 成人免费毛片aaaaa**| 欧美日韩亚洲高清一区二区| 精品少妇一区二区三区在线视频| 中文字幕一区二区视频| 日韩精品色哟哟| 成人精品免费看| 欧美人体做爰大胆视频| 欧美国产精品一区二区| 五月婷婷综合在线| aaa国产一区| 欧美一区二区三区小说| 国产精品久99| 蜜乳av一区二区| 色诱亚洲精品久久久久久| 日韩视频在线观看一区二区| 亚洲三级免费电影| 韩国欧美一区二区| 欧美午夜精品一区二区三区| 国产日韩精品一区二区三区 | 日本女人一区二区三区| 丰满亚洲少妇av| 日韩一级视频免费观看在线| 亚洲色欲色欲www| 国产又粗又猛又爽又黄91精品| 欧美亚洲综合久久| 国产精品久久久久毛片软件| 奇米色一区二区| 欧美系列在线观看| 国产精品美女视频| 国产在线精品免费| 欧美一区二区三区四区久久| 亚洲欧洲制服丝袜| 国产99精品国产| 精品欧美乱码久久久久久1区2区| 亚洲无线码一区二区三区| 9人人澡人人爽人人精品| 久久人人爽爽爽人久久久| 日本麻豆一区二区三区视频| 色美美综合视频| 自拍偷拍亚洲综合| 不卡在线观看av| 国产日产欧美一区二区三区| 捆绑调教美女网站视频一区| 7799精品视频| 日日夜夜精品视频天天综合网| 欧美色电影在线| 洋洋av久久久久久久一区| 91网上在线视频| 亚洲欧洲精品成人久久奇米网| 懂色av一区二区三区免费观看| 亚洲精品一区二区三区四区高清| 捆绑变态av一区二区三区| 欧美精品第1页| 视频在线观看91| 91麻豆精品国产自产在线| 午夜精品久久久久| 欧美少妇bbb| 天涯成人国产亚洲精品一区av| 欧美日韩另类一区| 婷婷国产在线综合| 日韩一区二区在线观看视频| 日韩国产一区二| 日韩精品一区二区三区视频播放 | 91国产成人在线| 亚洲综合在线观看视频| 在线一区二区视频| 午夜欧美视频在线观看| 在线电影国产精品| 久久99久久精品| 久久久久久99久久久精品网站| 国产一区二区在线电影| 国产亚洲一二三区| 97久久精品人人做人人爽50路| 亚洲精品国产a| 欧美日韩国产小视频| 免费成人你懂的| 精品第一国产综合精品aⅴ| 91精品久久久久久久久99蜜臂| 石原莉奈在线亚洲三区| 日韩午夜激情av| 国产91丝袜在线18| 亚洲欧美成人一区二区三区| 欧美午夜精品理论片a级按摩| 日韩国产在线观看| 国产日产精品一区| 日本韩国欧美三级| 日本欧美在线观看| 欧美激情一区二区三区不卡| 色婷婷久久久综合中文字幕| 婷婷六月综合亚洲| 久久免费的精品国产v∧| 成人免费三级在线| 天堂va蜜桃一区二区三区 | 国产欧美综合色| 91精彩视频在线观看| 免费一区二区视频| 国产精品乱人伦中文| 欧美日韩精品一区二区三区| 激情久久五月天| 一片黄亚洲嫩模| 久久婷婷综合激情| 色噜噜狠狠一区二区三区果冻| 美女看a上一区| 亚洲精品视频免费观看| 日韩一区二区三区免费看 | 精品视频在线免费观看| 精品一区二区三区av| 日韩理论在线观看| 精品区一区二区| 91成人免费在线视频| 国产一区二区三区四区五区入口| 亚洲视频狠狠干| 久久日韩粉嫩一区二区三区| 在线观看成人免费视频| 国产精品一二三| 五月天久久比比资源色| 国产精品嫩草久久久久| 日韩一区二区中文字幕| 91麻豆免费在线观看| 国产高清一区日本|