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

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

?? graphic.cpp

?? BFS、DFS、有向圖、無向圖中的各種算法的實現
?? CPP
字號:
#include "stdafx.h"
#include "queue.h"
Graphic::Graphic()
{
	//構造函數對圖進行初始化
	m_verqueue = NULL;
	m_narc = 0;
	m_nver = 0;
	m_nvisit = 0;
	m_nunit = 0;
}
void Graphic::InsertArc(VerNode* pnode,VerNode* pend,int mark)
{
	//INSERTARC函數實現在pnode和pend之間插入一條弧
	ArcNode* pnew = (ArcNode*)new ArcNode;
	pnew->m_padjver = pend;
	pnew->m_pnextarc = NULL;
	pnew->info = mark;
	if(pnode->m_pfirstarc == NULL){
		pnode->m_pfirstarc = pnew;
		m_narc++;
	}
	else{
		for(ArcNode* p = pnode->m_pfirstarc;p->m_pnextarc;p = p->m_pnextarc){}
		p->m_pnextarc = pnew;
		m_narc++;
	}

}
BOOL Graphic::IsNewArc(VerNode* pnode,VerNode* pend)
{
	//判斷pnode和pend之間是否已存在一條弧
	for(ArcNode* p = pnode->m_pfirstarc;p;p = p->m_pnextarc){
		if(p->m_padjver == pend)
			return FALSE;
	}
	return TRUE;
}
CPoint Graphic::ChagetoPoint(CRect rect)
{
	//實現結點所占據的矩形到點的轉變
	CPoint point;
	point.x = (rect.left+rect.right)/2;
	point.y = (rect.bottom+rect.top)/2;
	return point;
}
void Graphic::DisplayGraph(CDC* pdc,int type)
{
	//在視圖上顯示圖的結構
	ArcNode* parc;
	CPoint point1,point2;
	pdc->SelectStockObject(BLACK_BRUSH);
	for(VerNode* pver = m_verqueue->m_phead;pver;pver = pver->m_pnextver){
			pdc->Ellipse(pver->m_rect);
			point1 = ChagetoPoint(pver->m_rect);
		for(parc = pver->m_pfirstarc;parc;parc = parc->m_pnextarc){
				pdc->MoveTo(point1);
				point2 = ChagetoPoint(parc->m_padjver->m_rect);
				pdc->LineTo(point2);
				if(type == 0){
					pdc->MoveTo(point2);
					pdc->LineTo(XL(point1.x,point1.y,point2.x,point2.y),
						YL(point1.x,point1.y,point2.x,point2.y));
					pdc->MoveTo(point2);
					pdc->LineTo(XR(point1.x,point1.y,point2.x,point2.y),
						YR(point1.x,point1.y,point2.x,point2.y));
					pdc->MoveTo(XL(point1.x,point1.y,point2.x,point2.y),
						YL(point1.x,point1.y,point2.x,point2.y));
					pdc->LineTo(XR(point1.x,point1.y,point2.x,point2.y),
					YR(point1.x,point1.y,point2.x,point2.y));
				}
		}	
	}
	pdc->SelectStockObject(WHITE_BRUSH);
}

void Graphic::DeleteVer(VerNode* pnode)
{
	//刪除pnode所指的結點
	VerNode* ptemp;
	ArcNode* parc,*parctemp = NULL;
	int arc = 0;
	for(ptemp = m_verqueue->m_phead;ptemp;ptemp = ptemp->m_pnextver){
		for(parc = ptemp->m_pfirstarc;parc;parc = parc->m_pnextarc){
			if(parc->m_padjver == pnode){
				parctemp = parc;
				arc++;
			}
		}
		if(parctemp != NULL)
		DeleteArc(ptemp,parctemp);
		parctemp = NULL;
	}
	m_narc = m_narc-GetArcNum(pnode)-arc;
	m_verqueue->m_phead = m_verqueue->DeleteVer(pnode);
}

void Graphic::DeleteArc(VerNode* pver,ArcNode* parc)
{
	//刪除以pver為頭到parc所指的鄰接結點之間的弧
	ArcNode* ptemp = pver->m_pfirstarc;
	if(parc == pver->m_pfirstarc){
		pver->m_pfirstarc = pver->m_pfirstarc->m_pnextarc;
	}
	else{
		for(;ptemp->m_pnextarc !=parc;ptemp = ptemp->m_pnextarc){}
		ptemp->m_pnextarc = parc->m_pnextarc;
		delete parc;
	}
}
int Graphic::GetArcNum(VerNode* pver)
{
	//獲得圖中弧的個數
	int n = 0;
	for(ArcNode* parc = pver->m_pfirstarc;parc;parc = parc->m_pnextarc){
		n++;
	}
	return n;
}

void Graphic::DeleteArc(VerNode* pstart,VerNode* pend)
{
	//刪除pstart和pend所指結點之間的弧
	VerNode* start = pstart,* end = pend;
	ArcNode* arc = NULL,* temp = NULL;
	for(arc = start->m_pfirstarc;arc;arc = arc->m_pnextarc){
		if(arc->m_padjver == pend){
			temp = arc;
			m_narc--;
		}
	}
	if(temp != NULL)
	DeleteArc(pstart,temp);
}

VerNode* Graphic::NameToPointer(CString name)
{
	//由結點的名字獲得它的指針
	VerNode* vertex = NULL;
	for(vertex = m_verqueue->m_phead;vertex;vertex = vertex->m_pnextver){
			if(vertex->m_strname == name)
				break;
	}
	return vertex;
}

int Graphic::CalculateDu(VerNode* pver)
{
	//計算結點pver的度數
	VerNode* ver;
	ArcNode* arc;
	int count = 0;
	for(ver = m_verqueue->m_phead;ver;ver = ver->m_pnextver){
		for(arc = ver->m_pfirstarc;arc;arc = arc->m_pnextarc){
			if(arc->m_padjver == pver)count++;
		}
	}
	for(arc = pver->m_pfirstarc;arc;arc = arc->m_pnextarc)count++;
	return count/2;

}

void Graphic::DFSTraverse(CDC* pdc)
{
	//DFS深度優先搜索函數
	//用于一次顯示所有的結點
	CPen pen(PS_DASHDOTDOT,2,RGB(255,0,0));
	pdc->SelectObject(&pen);
	for(VerNode* pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver)
		pnode->m_bvisit = FALSE;
	m_nvisit = 0;
	m_nunit = 0;

	for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		if(!pnode->m_bvisit){
			DFS(pnode,pdc);
			m_nunit++;
		}
	}
	pdc->SelectStockObject(BLACK_PEN);
}

void Graphic::DFS(VerNode* pnode,CDC* pdc)
{
	//DFS遞歸實現函數
	CString str;
	m_nvisit++;
	pnode->m_bvisit = TRUE;

	str.Format("%d",m_nvisit);	
	pdc->Ellipse(pnode->m_rect.left-5,pnode->m_rect.top-5,
		pnode->m_rect.right+5,pnode->m_rect.bottom+5);
	pdc->TextOut(pnode->m_rect.left,pnode->m_rect.top-3,str);

	for(ArcNode* parc = pnode->m_pfirstarc;parc;parc = parc->m_pnextarc){
		VerNode* padj = parc->m_padjver;
		if(!padj->m_bvisit)
			DFS(padj,pdc);
	}
}

void Graphic::DFSTraverse()
{
	//DFS深度優先搜索
	//用于實現逐步顯示
	for(VerNode* pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver)
		pnode->m_bvisit = FALSE;
	m_nvisit = 0;
	m_nunit = 0;

	for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		if(!pnode->m_bvisit){
			DFS(pnode);
			m_nunit++;
		}
	}

}

void Graphic::DFS(VerNode* pnode)
{
	//DFS深度優先遞歸函數
	//用于實現逐步顯示
	pnode->m_bvisit = TRUE;
	m_nvisit++;
	pnode->m_nvisit = m_nvisit;
	
	for(ArcNode* parc = pnode->m_pfirstarc;parc;parc = parc->m_pnextarc){
		VerNode* padj = parc->m_padjver;
		if(!padj->m_bvisit)
			DFS(padj);
	}
}

void Graphic::BFSTraverse()
{
	//BFS廣度優先搜索
	//用于逐步顯示搜索的過程
	VerQueue queue;
	VerNode pnode1;
	for(VerNode* pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		pnode->m_bvisit = FALSE;
	}
	m_nvisit = 0;
	for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		if(!pnode->m_bvisit){
			m_nvisit++;
			pnode->m_bvisit = TRUE;
			pnode->m_nvisit = m_nvisit;

			queue.EnQueue(*pnode);
			while(queue.m_nnum){
				queue.DeQueue(pnode1);
				for(ArcNode* parc = pnode1.m_pfirstarc;parc;parc = parc->m_pnextarc){
					if(!parc->m_padjver->m_bvisit)
					{
						m_nvisit++;
						parc->m_padjver->m_bvisit = TRUE;
						parc->m_padjver->m_nvisit = m_nvisit;
						queue.EnQueue(*parc->m_padjver);
					}	//inner if
				}	//inner for

			}	//while
		}	//outer if
	}	//outer for

}

void Graphic::BFSTraverse(CDC* pdc)
{
	//BFS廣度優先搜索
	//用于實現一次性顯示廣度優先搜索的過程
	CPen pen(PS_DASHDOTDOT,2,RGB(255,0,0));
	pdc->SelectObject(&pen);
	VerQueue queue;
	VerNode pnode1;
	CString str;
	for(VerNode* pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		pnode->m_bvisit = FALSE;
	}
	m_nvisit = 0;
	for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		if(!pnode->m_bvisit){
			m_nvisit++;
			pnode->m_bvisit = TRUE;

			str.Format("%d",m_nvisit);	
			pdc->Ellipse(pnode->m_rect.left-5,pnode->m_rect.top-5,
					pnode->m_rect.right+5,pnode->m_rect.bottom+5);
			pdc->TextOut(pnode->m_rect.left,pnode->m_rect.top-3,str);

			queue.EnQueue(*pnode);
			while(queue.m_nnum){
				queue.DeQueue(pnode1);
				for(ArcNode* parc = pnode1.m_pfirstarc;parc;parc = parc->m_pnextarc){
					if(!parc->m_padjver->m_bvisit)
					{
						m_nvisit++;
						parc->m_padjver->m_bvisit = TRUE;
						str.Format("%d",m_nvisit);	
						pdc->Ellipse(parc->m_padjver->m_rect.left-5,
									parc->m_padjver->m_rect.top-5,
									parc->m_padjver->m_rect.right+5,
									parc->m_padjver->m_rect.bottom+5);
						pdc->TextOut(parc->m_padjver->m_rect.left,
									parc->m_padjver->m_rect.top-3,str);
						queue.EnQueue(*parc->m_padjver);
					}	//inner if
				}	//inner for

			}	//while
		}	//outer if
	}	//outer for
	pdc->SelectStockObject(BLACK_PEN);
}

int Graphic::CalculateInDu(VerNode* pver)
{
	//對于有向圖計算它的入度
	int count = 0;
	for(VerNode* ver = m_verqueue->m_phead;ver;ver = ver->m_pnextver){
		for(ArcNode* arc = ver->m_pfirstarc;arc;arc = arc->m_pnextarc){
			if(arc->m_padjver == pver)count++;
		}
	}
	return count;
}

int Graphic::CalculateOutDu(VerNode* pver)
{
	//對于有向圖計算它的出度
	int count = 0;
	for(ArcNode* parc = pver->m_pfirstarc;parc;parc = parc->m_pnextarc)
		count++;
	return count;
}

int Graphic::XL(int x1,int y1,int x2,int y2)
{
	int a,b;
	a = ((x2-x1)*(x2-x1)*(7*x2/8+x1/8))+((y2-y1)*(y2-y1)*x2)-(y2-y1)*(y2-y1)*(x2-x1)/8-12*(y2-y1)*(x2-x1);
	b = (y2-y1)*(y2-y1)+(x2-x1)*(x2-x1);
	return a/b;
}

int Graphic::YL(int x1,int y1,int x2,int y2)
{
	int a,b,c,d;
	a = (y2-y1)*(y2-y1);
	b = (x2-x1)*(x2-x1);
	c = a*(7*y2/8+y1/8)+b*(y2+12)-b*(y2-y1)/8;
	d = a+b;
	return c/d;
}

int Graphic::XR(int x1,int y1,int x2,int y2)
{
	int a,b;
	a = ((x2-x1)*(x2-x1)*(7*x2/8+x1/8))+((y2-y1)*(y2-y1)*x2)-(y2-y1)*(y2-y1)*(x2-x1)/8+12*(y2-y1)*(x2-x1);
	b = (y2-y1)*(y2-y1)+(x2-x1)*(x2-x1);
	return a/b;
}

int Graphic::YR(int x1,int y1,int x2,int y2)
{
	int a,b,c,d;
	a = (y2-y1)*(y2-y1);
	b = (x2-x1)*(x2-x1);
	c = a*(7*y2/8+y1/8)+b*(y2-12)-b*(y2-y1)/8;
	d = a+b;
	return c/d;
}

BOOL Graphic::TestKeda(VerNode* start,VerNode* end)
{
	//判斷start結點到end結點之間是否可達
	for(VerNode* pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		pnode->m_bvisit = FALSE;
	}
	int mark = 0;
	TKD(start,end,mark);
	return mark;
}

void Graphic::TKD(VerNode* start,VerNode* end,int& mark)
{
	//判斷keda的具體函數
	start->m_bvisit = TRUE;
	for(ArcNode* parc = start->m_pfirstarc;parc;parc = parc->m_pnextarc){
		VerNode* padj = parc->m_padjver;
		if(!padj->m_bvisit){
			if(padj == end)mark = 1;
			else TKD(padj,end,mark);
		}
	}
}

int Graphic::PointerToNum(VerNode* pnode)
{
	//由結點pnode的指針轉換為它的編號
	int count = 0;
	for(VerNode* pver = m_verqueue->m_phead;pver;pver = pver->m_pnextver){
		if(pver == pnode)return count;
		else count++;
	}
	return -1;

}
void Graphic::ShortestPath(VerNode* pstart,BOOL** p)
{
	//求出由結點PSTART到其余各個結點之間的最小路徑
	int v0,v,min,adj,w;
	VerNode* pmin;
	v0 = PointerToNum(pstart);

///////////////////////////////////////////////////////////////////////////////////
	for(VerNode* pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		pnode->m_bvisit = FALSE;
		pnode->m_nvisit = INFINITY;
	}
	for(ArcNode* parc = pstart->m_pfirstarc;parc;parc = parc->m_pnextarc){
		parc->m_padjver->m_nvisit = parc->info;			
	}
	for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
		v = PointerToNum(pnode);
		for(w = 0;w<m_verqueue->m_nnum;w++)p[v][w] = FALSE;
		if(pnode->m_nvisit<INFINITY){
			p[v][v0] = TRUE;
			p[v][v] = TRUE;		
		}
	}
////////////////////////////////////////////////////////////////////////////////////

	pstart->m_bvisit = TRUE;
	pstart->m_nvisit = 0;

/////////////////////////////////////////////////////////////////////////////////////
	for(int i = 1;i<m_verqueue->m_nnum;i++){
		min = INFINITY;
		for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
			if(!pnode->m_bvisit)
				if(pnode->m_nvisit<min){
					pmin = pnode;
					min = pnode->m_nvisit;
				}
		}

		v = PointerToNum(pmin);
		pmin->m_bvisit = TRUE;

		for(pnode = m_verqueue->m_phead;pnode;pnode = pnode->m_pnextver){
			w = PointerToNum(pnode);
			adj = INFINITY;

			for(parc = pmin->m_pfirstarc;parc;parc = parc->m_pnextarc){
				if(pnode == parc->m_padjver)adj = parc->info;
			}
			
			if(!pnode->m_bvisit&&(min+adj<pnode->m_nvisit)){
				pnode->m_nvisit = min+adj;
				for(int j = 0;j<m_verqueue->m_nnum;j++)
					p[w][j] = p[v][j];
				p[w][w] = TRUE;
			}
		}	
	}
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品第五页| 日本一区二区动态图| 日韩亚洲欧美成人一区| 国产欧美日韩不卡| 精品sm在线观看| 2021国产精品久久精品| 一区二区三区日韩在线观看| 美洲天堂一区二卡三卡四卡视频| 成人国产精品免费观看动漫| 日韩一卡二卡三卡国产欧美| 久久毛片高清国产| 午夜av一区二区| youjizz久久| 久久嫩草精品久久久精品一| 亚洲大尺度视频在线观看| 国产成人aaa| 日韩欧美123| 亚洲v日本v欧美v久久精品| 成人毛片老司机大片| 26uuu国产在线精品一区二区| 婷婷开心久久网| 在线观看欧美黄色| 亚洲欧美日韩国产另类专区| 国产酒店精品激情| 精品美女一区二区| 蜜桃一区二区三区四区| 欧美精品日韩精品| 婷婷开心激情综合| 欧美色手机在线观看| 亚洲人成亚洲人成在线观看图片 | 国产麻豆视频精品| 日韩一区二区三区高清免费看看| 亚洲制服欧美中文字幕中文字幕| www.亚洲色图.com| 中文字幕中文乱码欧美一区二区| 国产在线精品一区在线观看麻豆| 91精品国产综合久久精品性色 | 亚洲精品成a人| 91免费看`日韩一区二区| 中文字幕一区二区日韩精品绯色| 国产成人精品午夜视频免费 | 久久99九九99精品| 精品电影一区二区三区| 韩国一区二区视频| 国产女主播视频一区二区| 国产成人自拍在线| 国产精品国产精品国产专区不片| 99re这里只有精品6| 亚洲免费观看视频| 欧美日韩一区二区在线视频| 婷婷中文字幕一区三区| 精品少妇一区二区三区| 久久精品国产免费看久久精品| 91精品国产综合久久久久久久久久 | 亚洲一区自拍偷拍| 91精选在线观看| 韩国成人在线视频| 国产精品久久久久久久久搜平片 | 无吗不卡中文字幕| 日韩精品专区在线| 懂色一区二区三区免费观看 | 亚洲午夜久久久久中文字幕久| 欧洲一区二区三区在线| 日本不卡的三区四区五区| 26uuu亚洲综合色| 色综合天天综合网天天狠天天| 亚洲小少妇裸体bbw| 精品久久久久久久久久久久包黑料 | 亚洲成av人影院在线观看网| 91精品国产黑色紧身裤美女| 国产精品99久久久| 洋洋av久久久久久久一区| 日韩色在线观看| 99精品国产一区二区三区不卡| 婷婷综合久久一区二区三区| 国产日韩欧美麻豆| 欧美日韩国产美| 国产精品1024| 午夜精品视频一区| 中文在线免费一区三区高中清不卡| 色婷婷久久久综合中文字幕| 奇米精品一区二区三区在线观看| 国产精品视频第一区| 91麻豆精品国产91久久久久久久久| 国产成人av影院| 日韩影院在线观看| 日韩伦理免费电影| 久久一日本道色综合| 91国产精品成人| 岛国精品在线播放| 日产欧产美韩系列久久99| 国产精品成人一区二区三区夜夜夜 | 国产福利不卡视频| 日韩精品一二三四| 一区二区三区不卡在线观看| 精品乱码亚洲一区二区不卡| 欧美在线影院一区二区| aaa亚洲精品一二三区| 人人狠狠综合久久亚洲| 亚洲人成网站在线| 久久精品男人天堂av| 欧美一级黄色录像| 欧美亚洲综合久久| 99久久99久久精品免费观看| 激情久久五月天| 丝袜诱惑亚洲看片| 亚洲一区电影777| 亚洲精品国产视频| 自拍偷拍亚洲综合| 国产精品久久久久久久久免费丝袜| 日韩精品最新网址| 日韩亚洲欧美高清| 日韩精品中文字幕一区二区三区 | 亚洲国产成人精品视频| 亚洲精品欧美综合四区| 自拍偷拍国产亚洲| 国产精品国产a| 国产精品二区一区二区aⅴ污介绍| 精品国产髙清在线看国产毛片| 欧美日韩另类国产亚洲欧美一级| 一本到不卡免费一区二区| 91网站视频在线观看| av电影一区二区| 一本到不卡免费一区二区| 99r国产精品| 日本国产一区二区| 欧美三级欧美一级| 91精品国产综合久久香蕉麻豆 | 亚洲人吸女人奶水| 亚洲精品国产精华液| 亚洲国产日韩av| 日韩高清不卡在线| 精一区二区三区| 国产精品一卡二| 成人综合婷婷国产精品久久蜜臀| 东方aⅴ免费观看久久av| 成人不卡免费av| 91丝袜国产在线播放| 欧美视频一区二区三区四区| 欧美久久久久久久久中文字幕| 91麻豆精品国产| 国产亚洲1区2区3区| 中文字幕中文字幕中文字幕亚洲无线| 17c精品麻豆一区二区免费| 一区二区视频在线看| 日韩国产精品久久久久久亚洲| 久久99精品久久久| 波多野结衣在线一区| 欧美在线小视频| 精品va天堂亚洲国产| 亚洲视频小说图片| 免费观看久久久4p| 成人午夜在线视频| 欧美色爱综合网| 中文字幕在线一区| 亚洲一区二区三区视频在线播放 | 亚洲欧美成aⅴ人在线观看 | 欧美色图免费看| 精品国产91九色蝌蚪| 亚洲日本丝袜连裤袜办公室| 热久久一区二区| 99久久精品免费看| 日韩午夜在线观看| 亚洲精品中文字幕乱码三区| 琪琪久久久久日韩精品| 懂色av中文一区二区三区| 欧美电影一区二区三区| 国产精品天干天干在线综合| 偷拍与自拍一区| 一本一道波多野结衣一区二区| 欧美一级在线观看| 亚洲精品日韩专区silk| 国产乱码精品一区二区三区av| 欧美午夜精品理论片a级按摩| 国产亚洲一区二区三区四区| 午夜a成v人精品| 91美女在线看| 国产女同互慰高潮91漫画| 欧美a一区二区| 欧美视频一区二区三区在线观看| 国产视频一区不卡| 精品一区二区三区视频| 欧美三级视频在线观看| 亚洲欧美一区二区在线观看| 国内成人免费视频| 日韩一区二区视频| 午夜婷婷国产麻豆精品| 色综合久久久久网| 亚洲欧洲日韩在线| 久久精品72免费观看| 水蜜桃久久夜色精品一区的特点| 风间由美一区二区三区在线观看| 91精品国产一区二区三区香蕉| 亚洲欧美国产高清| av激情亚洲男人天堂| 亚洲国产高清不卡| 国产精品系列在线播放| 精品成a人在线观看| 激情国产一区二区| 精品久久久影院|