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

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

?? 最佳匹配·可視化.cpp

?? 最佳匹配·可視化c++實現
?? CPP
?? 第 1 頁 / 共 2 頁
字號:


#include <windows.h>
#include <stdio.h>

HWND hwnd;
char str[255];
const int SCREEN_WIDTH = 640, SCREEN_HEIGHT = 480;
const int UP_MARGIN = SCREEN_HEIGHT / 4, DOWN_MARGIN = SCREEN_HEIGHT / 3;
int maxX, maxY;	/* screen dimensions */
HDC hdc, memdc; /* store the virtual device handle */
HBITMAP hbit; /* store the virtual bitmap */
HBRUSH hbrush; /* store the brush handle */
HGDIOBJ hOldbit,hOldbrush;
HPEN hOldpen;	/* handle of old pen */
HPEN hRedpen, hGreenpen, hBluepen, hYellowpen;	/* create pens */
PAINTSTRUCT paintstruct;

char szWinName[] = "MyWin";	/* name of window class */
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);

#include <iostream.h>				// 為了調用 cout 函數
#include <stdlib.h>					// 為了調用 srand 和 rand 函數
#include <time.h>					// 為了調用 time 函數

const int VERTEX_OF_X = 5;			// 設置二分圖 G 中 X 點集的大小為 VERTEX_OF_X
const int VERTEX_OF_Y = 5;			// 設置二分圖 G 中 Y 點集的大小為 VERTEX_OF_Y
const int MIN_WEIGHT = 0;			// 設置二分圖 G 中邊權最小值
const int MAX_WEIGHT = 9;			// 設置二分圖 G 中邊權最大值

int xPosX[VERTEX_OF_X];
int xPosY[VERTEX_OF_X];
int yPosX[VERTEX_OF_Y];
int yPosY[VERTEX_OF_Y];

signed int Weight[VERTEX_OF_X][VERTEX_OF_Y];// 用于標記二分圖 G = (X, E, Y) 中的已知邊集 E
											// 說明:Weight 的值表示邊權(可正可負)。
signed int LabelX[VERTEX_OF_X];				// 用于在尋找最佳匹配過程中對 X 的點作標記
											// 說明:LabelX 的值應當滿足 LabelX + LabelY >= Weight[X][Y]。
signed int LabelY[VERTEX_OF_Y];				// 用于在尋找最佳匹配過程中對 Y 的點作標記
											// 說明:LabelY 的值應當滿足 LabelX + LabelY >= Weight[X][Y]。
int Edge[VERTEX_OF_X][VERTEX_OF_Y];			// 用于標記二分圖 G = (X, E, Y) 中的已知邊集 E
											// 說明:Edge 的值為 0 表示無,為 1 表示有。
int Match[VERTEX_OF_X][VERTEX_OF_Y];		// 用于標記二分圖 G = (X, E, Y) 中的最佳匹配 M
											// 說明:Match 的值為 0 表示無,1 表示有。

void InitWeight();					// 用于初始化 Weight
void InitLabelX();					// 用于初始化 LabelX
void InitLabelY();					// 用于初始化 LabelY
void InitEdge();					// 用于初始化 Edge
void InitMatch();					// 用于初始化 Match

void DisplayWeight();				// 用于顯示 Weight
void DisplayLabelX();				// 用于顯示 LabelX
void DisplayLabelY();				// 用于顯示 LabelY
void DisplayEdge();					// 用于顯示 Edge
void DisplayMatch();				// 用于顯示 Match

void GenerateWeight();				// 用于隨機產生 Weight
void GenerateInitialMatch();		// 用于產生初始化匹配 Match
void GetFeasibleVertexLabeling();	// 對二分圖 G 進行任意可行頂點標號 L
void DetermineEqualitySubgraph();	// 確定相對應于 L 的等同子圖 GL
void GenerateOptimalAssignment();	// 用于產生最佳匹配

int GetNumberOfWeight();			// 用于獲取邊集 Weight 的大小
int GetNumberOfEdge();				// 用于獲取等同子圖 GL 的邊集 Edge 的大小
int GetSizeOfMatch();				// 用于獲取匹配 M 的大小
int IsMCompleteForG();				// 確定 Match 是否為 Weight 的完美匹配

int S[VERTEX_OF_X];					// 用于產生最佳匹配,存放 X 的頂點
int T[VERTEX_OF_Y];					// 用于產生最佳匹配,存放 Y 的頂點
int JS[VERTEX_OF_Y];				// 用于產生最佳匹配,存放 X 的鄰接頂點
int TC[VERTEX_OF_Y];				// 用于產生最佳匹配,存放 Y 的頂點,是 T 關于 Y 的補集

int SizeOfS;						// 用于記錄集合 S 的當前大小
int SizeOfT;						// 用于記錄集合 T 的當前大小
int SizeOfJS;						// 用于記錄集合 JS 的當前大小
int SizeOfTC;						// 用于記錄集合 TC 的當前大小

void InitS();						// 用于初始化 S
void InitT();						// 用于初始化 T
void InitJS();						// 用于初始化 JS
void InitTC();						// 用于初始化 TC

void DisplayS();					// 用于顯示 S
void DisplayT();					// 用于顯示 T
void DisplayJS();					// 用于顯示 JS
void DisplayTC();					// 用于顯示 TC

int GenerateS();					// 產生 S 并對其進行整理(包含排序和去重)
void DefragT();						// 對 T 進行整理(包含排序和去重)
void GenerateJS();					// 產生 JS 并對其進行整理(包含排序和去重)
void GenerateTC();					// 產生 TC 并對其進行整理(包含排序和去重)
int IsJSEqualT();					// 判斷 JS 和 T 是否相等

int Al;								// 用于存放 Al 的值
int FindAl();						// 計算 Al 的值并返回
void ConstructANewLabeling();		// 構建一個新的標號 L'
void FindMAlternatingPath(int x);	// 發現一個從 X 到 Y 的 M - 交錯路徑
void GenerateLargerMatching(int y);	// 根據 M - 交錯路徑 產生 Gl 中的一個更大的匹配 M'
int GetSumOfWeight();				// 計算最佳匹配中的邊權之和

signed int MarkX[VERTEX_OF_X];		// 用于在尋找 M - 交錯路徑 過程中對 X 的點作標記
									// 說明:MarkX 的值為 -2(初始無標記),-1(標記為 * ),j(標記為 Yj)。
signed int MarkY[VERTEX_OF_Y];		// 用于在尋找 M - 交錯路徑 過程中對 Y 的點作標記
									// 說明:MarkY 的值為 -2(初始無標記),-1(標記為 * ),i(標記為 Xi)。
signed int ScanX[VERTEX_OF_X];		// 用于在尋找 M - 交錯路徑 過程中對 X 的點作掃描
									// 說明:ScanX 的值為 0(初始未掃描),1(已掃描)。
signed int ScanY[VERTEX_OF_Y];		// 用于在尋找 M - 交錯路徑 過程中對 Y 的點作掃描
									// 說明:ScanX 的值為 0(初始未掃描),1(已掃描)。

void InitMarkX();					// 用于初始化 MarkX
void InitMarkY();					// 用于初始化 MarkY
void InitScanX();					// 用于初始化 ScanX
void InitScanY();					// 用于初始化 ScanY

void DisplayMarkX();				// 用于顯示 MarkX
void DisplayMarkY();				// 用于顯示 MarkY
void DisplayScanX();				// 用于顯示 ScanX
void DisplayScanY();				// 用于顯示 ScanY

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs,int nWinMode)
{
	MSG msg;
	WNDCLASSEX wcl;

	/* Define a window class. */
	wcl.cbSize = sizeof(WNDCLASSEX);
	wcl.hInstance = hThisInst; /* handle to this instance */
	wcl.lpszClassName = szWinName; /* window class name */
	wcl.lpfnWndProc = WindowFunc; /* window function */
	wcl.style = 0; /* default style */

	wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION); /* standard icon */
	wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* SMALL ICON */
	wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* cursor style */

	/* Specify name of menu resource. This will be overridden. */
	wcl.lpszMenuName = NULL; /* main menu */
	wcl.cbClsExtra = 0; /* no extra information needed */
	wcl.cbWndExtra = 0;	/* no extra information needed */
	
	/* Make the windows backgraoud white */
	wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

	/* Register the window class. */
	if(!RegisterClassEx(&wcl))
		return 0;

	/* Now that a window class has been registered, a window can be created. */
	hwnd = CreateWindow(
			szWinName,	/* name of window class */
			"最佳匹配·可視化", /* title */
			WS_OVERLAPPEDWINDOW, /* window style - normal */
			CW_USEDEFAULT,	/* X coordinate - let Winodws decide */
			CW_USEDEFAULT,	/* Y coordinate - let Windows decide */
			SCREEN_WIDTH,	/* width - let Windows decide */
			SCREEN_HEIGHT,	/* height - let Windows decide */
			HWND_DESKTOP, /* no parent window */
			NULL,  /*  no menu */
			hThisInst, /* handle of this instance of the program */
			NULL /* no additional arguments */
			);

	/* Display the windows. */
	ShowWindow(hwnd, nWinMode);
	UpdateWindow(hwnd);

	// 初始化隨機數發生器
	srand((unsigned)time(NULL));

	// 初始化 Weight, LabelX, LabelY, Edge, Match
	InitWeight();
	InitLabelX();
	InitLabelY();
	InitEdge();
	InitMatch();
	
	// 隨機產生二分圖 G 中的有權邊集 Weight
	GenerateWeight();
	DisplayWeight();

	// Start with an arbitrary feasible vertex labeling l, determine Gl, and choose
	// an arbitrary matching M in Gl.
	
	// 對二分圖 G 進行任意可行頂點標號 L(Feasible Vertex Labeling),
	GetFeasibleVertexLabeling();
	//DisplayLabelX();
	//DisplayLabelY();

	// 并由此確定相對應于 L 的等同子圖 GL 的無權邊集(Equality Subgraph for L)。
	DetermineEqualitySubgraph();
	//DisplayEdge();
	
	// 尋找等同子圖 GL 中的一個任意的初始化匹配 M
	GenerateInitialMatch();
	//cout << "初始化匹配為" << endl;
	//DisplayMatch();

	// 使用 The Kuhn-Munkres Algorithm 算法(亦稱為 the Hungarian method 方法)產生最佳匹配
	GenerateOptimalAssignment();

	/* Create the message loop. */
	while (GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg); /* translate keyboard messages */
		DispatchMessage(&msg); /* return control to Windows 98 */
	}
	return msg.wParam;
}
/* This function is called by Windows 98 and is passed 
	messages from the message gueue.
*/
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{	
	switch(message) {
	case WM_CREATE:
		/* get screen coordinates */
		maxX = GetSystemMetrics(SM_CXSCREEN);
		maxY = GetSystemMetrics(SM_CYSCREEN);

		/* make a compatible memory image */
		hdc = GetDC(hwnd);
		memdc = CreateCompatibleDC(hdc);
		
		hbit = CreateCompatibleBitmap(hdc,maxX,maxY);
		hOldbit = SelectObject(memdc,hbit);

		hbrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
		hOldbrush = SelectObject(memdc,hbrush);

		PatBlt(memdc,0,0,maxX,maxY,PATCOPY);

		hRedpen = CreatePen(PS_SOLID, 2, RGB(255,0,0));
		hGreenpen = CreatePen(PS_SOLID, 2, RGB(0,255,0));
		hBluepen = CreatePen(PS_SOLID, 2, RGB(0,0,255));
		hYellowpen = CreatePen(PS_SOLID, 4, RGB(255,255,0));

		hOldpen = (HPEN)SelectObject(memdc,hRedpen);
		SelectObject(memdc,hOldpen);

		ReleaseDC(hwnd,hdc);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hwnd,&paintstruct); /* get DC */
		/* now,copy memory image onto screen */
		BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
		EndPaint(hwnd,&paintstruct); /* release DC */
		break;
	case WM_DESTROY: /* terminate the program */
		/* delete pens */
		DeleteObject(hRedpen);
		DeleteObject(hGreenpen);
		DeleteObject(hBluepen);
		DeleteObject(hYellowpen);

		SelectObject(memdc,hOldbrush);
		DeleteObject(hbrush);

		SelectObject(memdc,hOldbit);
		DeleteObject(hbit);

		DeleteDC(memdc);
		PostQuitMessage(0);
		break;
	default:
		/* Let Windows 98 process any messages not specified in the preceding switch statement. */
		return DefWindowProc(hwnd,message,wParam,lParam);
	}
	return 0;
}

void GenerateOptimalAssignment(){
	int i, j, k, x, y, z;
	// 1. If M is complete for G, then M is optimal. Stop. Otherwise, there is some unmatched
	//    x (- X. Set S = {x} and T = NULL.
Step1:
	if (IsMCompleteForG() == 1){
		//cout << "M is optimal. Stop." << endl;
		cout << "最佳匹配(其權和為 " << GetSumOfWeight() << " )為" << endl;
		DisplayMatch();
		return;
	}
	else{
		//cout << "There is some unmatched x (- X." << endl;
		InitS();
		x = GenerateS();
		//DisplayS();
		InitT();
	}

	// 2. If Jgl(S) != T, go to step 3. Otherwise, Jgl(S) = T. Find
	//						Al	=	min	{ l(x) + l(y) - w(xy) }
	//							x(-S, y(-Tc
	//	  where Tc denotes the complement of T in Y, and construct a new labeling l' by
	//								l(v) - Al		for v (- S
	//						l'(v) = l(v) + Al		for v (- T
	//								l(v)			otherwise
	//	  Note that Al > 0 and Jgl'(S) != T. Replace l by l' and gl by gl'.
Step2:
	InitJS();
	GenerateJS();
	//DisplayJS();

	DefragT();
	//DisplayT();

	if (IsJSEqualT() == 0){
		goto Step3;
	}
	else{
		InitTC();
		GenerateTC();
		//DisplayTC();

		Al = FindAl();
		//cout << "Al = " << Al << endl;	// Note that Al > 0.

		ConstructANewLabeling();
		//DisplayLabelX();
		//DisplayLabelY();

		DetermineEqualitySubgraph();
		//DisplayEdge();

		InitJS();
		GenerateJS();
		//DisplayJS();
		//cout << "IsJSEqualT() = " << IsJSEqualT() << endl;	// Note that JS != T.
	}

	// 3. Choose a vertex y in Jgl(S), not in T. If y is matched in M, say with z (- X,
	//    replace S by S + {z} and T by T + {y}, and go to step 2. Otherwise, there will
	//    be an M-alternating path from x to y, and we may use this path to find a larger
	//    matching M' in Gl. Replace M by M' and go to step 1.
Step3:
	for (j = 0; j < SizeOfJS; j++){
		for (k = 0; k < SizeOfT; k++){
			if (T[k] == JS[j]){
				break;
			}
		}
		if (k == SizeOfT){
			y = JS[j];
			break;
		}
	}

	for (i = 0; i < VERTEX_OF_X; i++){
		if (Match[i][y] == 1){
			z = i;
			break;
		}
	}
	if (i != VERTEX_OF_X){
		S[SizeOfS++] = z;
		T[SizeOfT++] = y;
		goto Step2;
	}
	else{
		InitMarkX();		InitMarkY();		InitScanX();		InitScanY();
		//DisplayMarkX();	DisplayMarkY();		DisplayScanX();		DisplayScanY();
		FindMAlternatingPath(x);
		GenerateLargerMatching(y);
		goto Step1;
	}
}

int GetSumOfWeight(){
	int SumOfWeight = 0;
	for (int i = 0; i < VERTEX_OF_X; i++){
		for (int j = 0; j < VERTEX_OF_Y; j++){
			if (Match[i][j] == 1){
				SumOfWeight = SumOfWeight + Weight[i][j];
			}
		}
	}
	return SumOfWeight;
}

void FindMAlternatingPath(int x){
	int i, j, NewMarkAddToX, NewMarkAddToY;
	NewMarkAddToX = 0;
	MarkX[x] = -1;
	NewMarkAddToX++;
	while (NewMarkAddToX != 0){
		NewMarkAddToY = 0;
		for (i = 0; i < VERTEX_OF_X; i++){
			if ((MarkX[i] != -2) && (ScanX[i] == 0)){
				for (j = 0; j < VERTEX_OF_Y; j++){
					if ((MarkY[j] == -2) && (Edge[i][j] == 1) && (Match[i][j] == 0)){
						MarkY[j] = i;
						NewMarkAddToY++;
					}
				}
				ScanX[i] = 1;
			}
		}
		if (NewMarkAddToY == 0)
			return;
		NewMarkAddToX = 0;
		for (j = 0; j < VERTEX_OF_Y; j++){
			if ((MarkY[j] != -2) && (ScanY[j] == 0)){
				for (i = 0; i < VERTEX_OF_X; i++){
					if ((MarkX[i] == -2) && (Edge[i][j] == 1) && (Match[i][j] == 1)){
						MarkX[i] = j;
						NewMarkAddToX++;
					}
				}
				ScanY[j] = 1;
			}
		}
	}
}

void GenerateLargerMatching(int y){
	int i, j, flag;
	flag = 1;
	i = MarkY[y];
	Match[i][y] = 1;
	while (MarkX[i] != -1){
		if (flag == 1){
			flag = 0;
			j = MarkX[i];
			Match[i][j] = 0;
		}
		else{
			flag = 1;
			i = MarkY[j];
			Match[i][j] = 1;
		}
	}
}


void ConstructANewLabeling(){
	for (int i = 0; i < SizeOfS; i++){
		LabelX[S[i]] = LabelX[S[i]] - Al;
	}
	for (int j = 0; j < SizeOfT; j++){
		LabelY[T[j]] = LabelY[T[j]] + Al;
	}
}

int FindAl(){
	int min = LabelX[S[0]] + LabelY[TC[0]] - Weight[S[0]][TC[0]];
	for (int i = 0; i < SizeOfS; i++){
		for (int j = 0; j < SizeOfTC; j++){
			if (LabelX[S[i]] + LabelY[TC[j]] - Weight[S[i]][TC[j]] < min){
				min = LabelX[S[i]] + LabelY[TC[j]] - Weight[S[i]][TC[j]];
			}
		}
	}
	return min;
}

void GenerateTC(){
	int j, k, l, temp;
	// Step 1: 產生
	for (j = 0; j < VERTEX_OF_Y; j++){
		for (k = 0; k < SizeOfT; k++){
			if (T[k] == j){
				break;
			}
		}
		if (k == SizeOfT)
			TC[SizeOfTC++] = j;
	}
	// Step 2: 排序
	for (j = 0; j < SizeOfTC; j++){
		for (k = j + 1; k < SizeOfTC; k++){
			if (TC[j] > TC[k]){
				temp = TC[j];
				TC[j] = TC[k];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男人天堂av| 国产亚洲成av人在线观看导航| 亚洲韩国精品一区| 欧美色视频一区| 丝袜美腿成人在线| 日韩一区二区免费电影| 久久电影网站中文字幕| 国产亚洲综合av| 成人黄色国产精品网站大全在线免费观看 | 91精品国产乱| 久久精品国产亚洲高清剧情介绍| 久久久青草青青国产亚洲免观| 国产盗摄视频一区二区三区| 亚洲欧美色一区| 欧美网站一区二区| 精品在线一区二区三区| 国产日韩精品视频一区| 日本韩国视频一区二区| 视频一区二区中文字幕| 国产肉丝袜一区二区| 色欧美88888久久久久久影院| 无吗不卡中文字幕| 久久婷婷久久一区二区三区| 成人99免费视频| 日韩精品视频网站| 久久久不卡网国产精品一区| 99re这里只有精品视频首页| 日韩不卡一二三区| 国产精品三级电影| 欧美影院一区二区| 国产成人在线网站| 午夜精品一区二区三区三上悠亚| 日本一区二区三区四区在线视频| 欧美午夜免费电影| 国产精品乡下勾搭老头1| 亚洲最大成人网4388xx| 久久久亚洲综合| 在线看日本不卡| 国产精品99久久久久| 亚洲综合在线第一页| 久久精品欧美一区二区三区不卡 | 91尤物视频在线观看| 老司机午夜精品99久久| 亚洲另类在线一区| 国产亚洲精品免费| 欧美一区二区三区在| 91高清在线观看| 国产成人精品免费在线| 人禽交欧美网站| 亚洲一区在线视频观看| 欧美激情一区二区三区四区| 蜜臀久久久久久久| 五月婷婷色综合| 日韩欧美视频在线| 欧美亚洲免费在线一区| 99久久伊人久久99| 精品亚洲国内自在自线福利| 午夜视频在线观看一区二区| 专区另类欧美日韩| 国产精品区一区二区三| 国产亚洲欧美日韩日本| 欧美一级高清片在线观看| 欧美性xxxxxx少妇| 色综合色狠狠综合色| 不卡一二三区首页| 国产成人av资源| 国产主播一区二区三区| 美女脱光内衣内裤视频久久网站 | 亚洲国产综合91精品麻豆| 亚洲视频一区二区在线| 国产精品国产精品国产专区不片 | 7777精品伊人久久久大香线蕉经典版下载| 成人精品小蝌蚪| jizzjizzjizz欧美| 成人av在线网| 99这里都是精品| www.亚洲在线| 91免费观看视频| 日本久久一区二区三区| 91在线观看高清| 91黄视频在线观看| 在线观看三级视频欧美| 在线不卡免费欧美| 欧美怡红院视频| 欧美日韩精品免费| 7777精品伊人久久久大香线蕉超级流畅| 欧美视频中文字幕| 欧美性一级生活| 91麻豆精品国产91久久久久久久久| 欧美日韩另类一区| 日韩一区二区影院| 精品日韩99亚洲| 国产视频在线观看一区二区三区| 日本一区二区成人| 亚洲激情中文1区| 无吗不卡中文字幕| 激情五月播播久久久精品| 国产精品538一区二区在线| 成人丝袜高跟foot| 一本高清dvd不卡在线观看| 欧美主播一区二区三区| 日韩一级黄色片| 久久久国产一区二区三区四区小说| 国产色产综合产在线视频| 国产精品成人免费| 午夜精品福利在线| 精品亚洲aⅴ乱码一区二区三区| 国产精品99久| 91久久线看在观草草青青| 欧美一级爆毛片| 欧美国产丝袜视频| 天天色综合天天| 国产精品一区二区在线观看不卡 | 精品国产污污免费网站入口| 国产精品毛片久久久久久久| 亚洲第一久久影院| 国产高清久久久久| 欧美艳星brazzers| 久久久久9999亚洲精品| 亚洲一区二区三区小说| 极品少妇xxxx精品少妇偷拍| 99精品久久99久久久久| 欧美一级高清片| 亚洲免费av观看| 久久福利资源站| 色老头久久综合| 精品国产亚洲在线| 亚洲成人第一页| 国产成人av一区| 91精品国产综合久久久久久漫画| 国产视频视频一区| 午夜激情久久久| 91视视频在线直接观看在线看网页在线看| 欧美高清www午色夜在线视频| 中文乱码免费一区二区| 蜜桃久久久久久| 欧美日韩一区二区欧美激情| 国产精品嫩草影院com| 免费的成人av| 欧美中文字幕一区二区三区亚洲| 国产午夜精品理论片a级大结局| 亚洲成人一区在线| 91蝌蚪porny九色| 国产精品久久久久久久浪潮网站 | 一区二区在线电影| 粉嫩av一区二区三区粉嫩| 欧美本精品男人aⅴ天堂| 丝袜美腿亚洲一区| 欧美猛男gaygay网站| 一区二区三区高清在线| av色综合久久天堂av综合| 久久影视一区二区| 麻豆成人免费电影| 日韩一区二区三区三四区视频在线观看| 一区二区国产盗摄色噜噜| av一本久道久久综合久久鬼色| 精品福利av导航| 精品影视av免费| 精品国产sm最大网站免费看| 麻豆中文一区二区| 欧美一区二区三区在线| 亚洲自拍偷拍网站| 色哟哟一区二区三区| 国产亚洲一区字幕| 成人av在线电影| 国产精品素人视频| 成人高清视频免费观看| 国产网站一区二区| 九色综合狠狠综合久久| 国产精品一区二区久久不卡| 久久久亚洲精品一区二区三区 | 国产成人免费视| 精品乱人伦小说| 国产精品一卡二卡在线观看| 欧美mv和日韩mv国产网站| 美腿丝袜在线亚洲一区| 欧美一三区三区四区免费在线看| 日韩综合小视频| 欧美另类久久久品| 性久久久久久久| 91精品国产91久久久久久最新毛片| 日日摸夜夜添夜夜添精品视频| 欧美亚洲高清一区二区三区不卡| 亚洲乱码中文字幕综合| 欧美日韩国产经典色站一区二区三区| 一卡二卡三卡日韩欧美| 色哟哟日韩精品| 国产精品久久久久久福利一牛影视| va亚洲va日韩不卡在线观看| 中文字幕一区二区三区四区| www.66久久| 日韩av成人高清| 精品国产百合女同互慰| 国产成人综合亚洲91猫咪| 国产精品欧美一级免费| 97se亚洲国产综合自在线观| 亚洲一区二区三区视频在线| 欧美中文字幕一二三区视频| 久久疯狂做爰流白浆xx| 国产情人综合久久777777|