日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

發(fā)布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、最短路徑概念

二、迪杰斯特拉(Dijkstra)算法(單源最短路徑)

1、原理

2、過程

?3、代碼

三、弗洛伊德(Floyd)算法(多源最短路徑)

1、原理

2、存儲

3、遍歷

4、代碼

參考資料


?

一、最短路徑概念

最短路徑,顧名思義,兩結(jié)點(diǎn)之間最短的路徑(可以是非鄰接結(jié)點(diǎn))。

最小生成樹最短路徑區(qū)別:

最小生成樹連通圖最短路徑

最短路徑:兩任意結(jié)點(diǎn)之間(可以非鄰接)的最短路徑

二、迪杰斯特拉(Dijkstra)算法(單源最短路徑)

優(yōu)點(diǎn):效率較高,時間復(fù)雜度為O(n^2)

缺點(diǎn):只能求一個頂點(diǎn)所有頂點(diǎn)最短路徑單源最短路

1、原理

1、先選定一個根結(jié)點(diǎn),并選定一個數(shù)組,先確定未遍歷前的初始距離,把距離最短的鄰接結(jié)點(diǎn)選定為中間結(jié)點(diǎn),并標(biāo)記訪問過,開始往下遍歷,挨個訪問那個中間結(jié)點(diǎn)鄰接結(jié)點(diǎn)。計(jì)算出根結(jié)點(diǎn)到中間結(jié)點(diǎn)+中間結(jié)點(diǎn)到新鄰接結(jié)點(diǎn)的距離,作為新距離,對比新距離和舊距離,如果新距離大,則把新距離替換掉舊距離,否則不變。

2、一輪訪問結(jié)束后,從未標(biāo)記的結(jié)點(diǎn)選定距離最短的,把它作為中間結(jié)點(diǎn),繼續(xù)往下訪問。若都標(biāo)記過,則算法結(jié)束。

2、過程

?1、保存根結(jié)點(diǎn)及到其他結(jié)點(diǎn)的權(quán)(距離)

?2、?訪問最近結(jié)點(diǎn)作為中間結(jié)點(diǎn)

3、對比新距離根結(jié)點(diǎn)到中間結(jié)點(diǎn)+中間結(jié)點(diǎn)到新結(jié)點(diǎn))和舊距離根結(jié)點(diǎn)直接到新結(jié)點(diǎn))?

?4、若新距離短,修改保存到數(shù)組

?5、繼續(xù)訪問后面的,把未訪問的距離根最近結(jié)點(diǎn)作為中間結(jié)點(diǎn)繼續(xù)訪問它的鄰接結(jié)點(diǎn)

?6、繼續(xù)對比新距離和舊距離

?7、若新距離短,則修改保存到數(shù)組

?8、?繼續(xù)以距離根結(jié)點(diǎn)最短的結(jié)點(diǎn)為對象,訪問它的鄰接結(jié)點(diǎn)

?9、全部訪問完畢,結(jié)束算法

欣賞一下自己的稿書:?

?3、代碼

//迪杰斯特拉(Dijkstra)算法
/*測試案例
ABCDEFGHI
B 1 C 5
A 1 C 3 D 7 E 5
A 5 B 3 E 1 F 7
B 7 E 2 G 3
B 5 C 1 F 3 H 9 G 6 D 2
C 7 E 3 H 5
D 3 E 6 H 2 I 7
F 5 E 9 G 2 I 4
G 7 H 4
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>#define MAXSIZE 20
#define MAX 65535					//代表無窮大
int length = 0;							//頂點(diǎn)個數(shù)
int root = 0;								//根頂點(diǎn)
int rootDist[MAXSIZE];				//根頂點(diǎn)(記錄根到其他頂點(diǎn)的距離)
bool visit[MAXSIZE];				//記錄各結(jié)點(diǎn)是否訪問//圖(頂點(diǎn)和權(quán))
typedef struct
{char vertex[MAXSIZE];int weight[MAXSIZE][MAXSIZE];			//權(quán)可以代替邊(自身為0,相連有值,不相連無窮大)
}Graph;
Graph G;//輸入頂點(diǎn)
void InputVertex()
{int i;char ch;printf("請輸入圖的頂點(diǎn):\n");scanf("%c", &ch);for (i = 0; i < MAXSIZE && ch != '\n'; i++){G.vertex[i] = ch;scanf("%c", &ch);}length = i;
}//圖權(quán)重初始化
void GraphWeightInit()
{int i, j;for (i = 0; i < length; i++){for (j = 0; j < length; j++){if (i == j)							//指向自己G.weight[i][j] = 0;elseG.weight[i][j] = MAX;	//無窮大}}
}//根據(jù)數(shù)據(jù)查找圖頂點(diǎn)下標(biāo)
int FindIndex(char ch)
{int i;for (i = 0; i < length; i++){if (G.vertex[i] == ch)return i;}return -1;
}//創(chuàng)建圖
void CreateGraph()
{int i, j, index, weight;char ch;for (i = 0; i < length; i++){printf("請輸入%c的鄰接頂點(diǎn)及權(quán)重(空格分隔,換行結(jié)束):\n", G.vertex[i]);scanf("%c", &ch);while (ch != '\n'){while (ch == ' ')				//為空格{scanf("%c", &ch);			//輸入字符continue;}index = FindIndex(ch);scanf("%d", &weight);		//輸入權(quán)重while (weight == 32)		//32為空格的ASCII碼{scanf("%d", &weight);continue;}G.weight[i][index] = weight;	//存入權(quán)重scanf("%c", &ch);				//(下一輪)輸入字符}}
}//根結(jié)點(diǎn)初始化
void Init()
{int i;printf("請輸入根結(jié)點(diǎn):\t");scanf("%d", &root);for (i = 0; i < length; i++){rootDist[i] = G.weight[root][i];		//把0作為根,初始化visit[i] = false;								//未訪問}
}//取最小(在未訪問的結(jié)點(diǎn)中)
int GetMinInVisit()
{int i, min = 0;for (i = 0; i < length; i++){//未訪問if (!visit[i]){//找到最小下標(biāo)(不能是自身)if (rootDist[min] > rootDist[i] || rootDist[min] == 0){min = i;}}}return min;
}//檢查是否訪問完畢
bool IsNull()
{bool flag = true;for (int i = 0; i < length; i++){if (!visit[i])				//還有未訪問的flag = false;}return flag;
}//迪杰斯特拉(Dikstra)算法(生成根到其他頂點(diǎn)的最短路徑)
void Dijkstra(int index)
{int i;visit[index] = true;						//標(biāo)記訪問printf("%c %d\t", G.vertex[index], rootDist[index]);//遍歷中間結(jié)點(diǎn)的鄰接結(jié)點(diǎn),對比新舊距離for (i = 0; i < length; i++){//若 舊距離 > 新距離(改變新距離覆蓋舊距離)if (rootDist[i] > (rootDist[index] + G.weight[index][i])){rootDist[i] = rootDist[index] + G.weight[index][i];}}//退出判斷if (IsNull())return;index = GetMinInVisit();				//取出最小鄰接結(jié)點(diǎn),作為中間結(jié)點(diǎn)Dijkstra(index);								//遞歸調(diào)用Dijkstra()
}//輸出測試
void Print()
{for (int i = 0; i < length; i++){printf("\n%c結(jié)點(diǎn)鄰接結(jié)點(diǎn):\t", G.vertex[i]);for (int j = 0; j < length; j++){if (G.weight[i][j] != 0 && G.weight[i][j] != MAX)		//有鄰接結(jié)點(diǎn){printf("%c %d\t", G.vertex[j], G.weight[i][j]);}}}
}int main()
{InputVertex();				//輸入頂點(diǎn)GraphWeightInit();		    //圖權(quán)重初始化CreateGraph();				//創(chuàng)建圖Init();						//初始化Dijkstra(root);				//迪杰斯特拉算法(先以根結(jié)點(diǎn)為中間結(jié)點(diǎn)遍歷)(生成根到其他頂點(diǎn)的最短路徑)//Print();					//測試輸出return 0;
}

三、弗洛伊德(Floyd)算法(多源最短路徑)

優(yōu)點(diǎn):所有頂點(diǎn)所有頂點(diǎn)最短路徑。(多源最短路

缺點(diǎn):效率較低,時間復(fù)雜度為O(n^3)。??

1、原理

基本思想:

不斷找點(diǎn)進(jìn)行中轉(zhuǎn),比較中轉(zhuǎn)前后最小距離

原理:

最優(yōu)子結(jié)構(gòu):圖結(jié)構(gòu)中一個顯而易見的定理:最短路徑的子路徑仍然是最短路徑?,這個定理顯而易見,比如一條從a到e的最短路徑a->b->c->d->e 那么 a->b->c 一定是a到c的最短路徑c->d->e一定是c到e的最短路徑,反過來,(原理)如果一條最短路必須要經(jīng)過點(diǎn)k,那么i->k的最短路徑+k->j的最短路徑一定是i->j 經(jīng)過k的最短路徑因此,最優(yōu)子結(jié)構(gòu)可以保證

(左邊矩陣是改進(jìn)前的,右邊矩陣是改進(jìn)后的。)

弗洛伊德算法定義了兩個二維矩陣

D矩陣存放最小權(quán)(最短路徑)P矩陣存放最短前驅(qū)(中轉(zhuǎn)點(diǎn))

1、矩陣D記錄頂點(diǎn)間的最小路徑
例如D[1][2]= 3,說明頂點(diǎn)1?到 2?的最短路徑為3;
2、矩陣P記錄頂點(diǎn)間最小路徑中的中轉(zhuǎn)點(diǎn)
例如P[1][2]= 0?說明,1?到 2的最短路徑軌跡為:1?-> 0?-> 2。
它通過3重循環(huán),medium為中轉(zhuǎn)點(diǎn)begin為起點(diǎn)end為終點(diǎn),循環(huán)比較D[begin][end] D[begin][medium] + D[medium][end] 之間的最小值,如果(D[begin][medium] + D[medium][end] )為更小值,則把(D[begin][medium] + D[medium][end] )覆蓋保存在(D[begin][end])中。

2、存儲

弗洛伊德算法定義了兩個二維矩陣

D矩陣存放最小權(quán)(最短路徑)P矩陣存放最短前驅(qū)(中轉(zhuǎn)點(diǎn))

?思考:如果求任意兩點(diǎn)之間的最短路徑,兩點(diǎn)之間可以直接到達(dá)但卻不是最短的路徑,要讓任意兩點(diǎn)(例如從頂點(diǎn)a點(diǎn)到頂點(diǎn)b)之間的路程變短只能引入第三個點(diǎn)(頂點(diǎn)medium)并通過這個頂點(diǎn)medium中轉(zhuǎn)即a->medium->b才可能縮短原來從頂點(diǎn)a點(diǎn)到頂點(diǎn)b的路程。那么這個中轉(zhuǎn)頂點(diǎn)medium是1~n中的哪個點(diǎn)呢?甚至有時候不只通過一個點(diǎn)而是經(jīng)過兩個點(diǎn)或者更多中轉(zhuǎn)點(diǎn)會更短

下面給出一些例子深入理解一下:

:????????4 -> 3? ? ? ? ? 一、直接:D[4][3] = 12? ? ? ?二、 過1:D[4][1]+D[1][3]=11? ?

過1更短,????????則D[4][3] = 11????????且P[4][3] = P[4][1] = 1

:? ? ? ? 1?->3? ? ? ???一、直接:D[1][3] = 6????????二、過2:D[1][2]+D[2][3] = 5

過2更短,????????則D[1][3] = 6? ? ? ? ? 且P[1][3] = P[1][2] = 2

?1、假如現(xiàn)在只允許經(jīng)過1號頂點(diǎn),求任意兩點(diǎn)的最短路徑我們應(yīng)該怎么求呢??

?我們只需要判斷 (D[begin][end])?與 (D[begin][1] + D[1][end]) 的大小。(前者直接到達(dá),后者經(jīng)歷中轉(zhuǎn))

//只經(jīng)過1號中轉(zhuǎn)頂點(diǎn)
for (begin = 1; begin <= n; begin++)for (end = 1; end <= n; end++)if (D[begin][end] > D[begin][1] + D[1][end])D[begin][end] = D[begin][1] + D[1][end];

?在只允許經(jīng)過1號中轉(zhuǎn)頂點(diǎn)的情況下,任意兩點(diǎn)之間的路程更新為:

2、繼續(xù)求在只允許經(jīng)過1和2號兩個中轉(zhuǎn)頂點(diǎn)的情況下任意兩點(diǎn)之間的最短路程

//只經(jīng)過1號中轉(zhuǎn)頂點(diǎn)
for (begin = 1; begin <= n; begin++)for (end = 1; end <= n; end++)if (D[begin][end] > D[begin][1] + D[1][end])D[begin][end] = D[begin][1] + D[1][end];//只經(jīng)過2號中轉(zhuǎn)頂點(diǎn)
for (begin = 1; begin <= n; begin++)for (end = 1; end <= n; end++)if (D[begin][end] > D[begin][2] + D[2][end])D[begin][end] = D[begin][2] + D[2][end];

在只允許更新1號和2號頂點(diǎn)的情況下,任意兩點(diǎn)之間的路徑更新為:

?3、..........繼續(xù)往后,運(yùn)行經(jīng)過n個中轉(zhuǎn)頂點(diǎn)(即全部)

//運(yùn)行經(jīng)過所有中轉(zhuǎn)頂點(diǎn)
for(medium = 0; medium <= n; medium++)for (begin = 1; begin <= n; begin++)for (end = 1; end <= n; end++)if (D[begin][end] > D[begin][medium] + D[medium][end])D[begin][end] = D[begin][medium] + D[medium][end];

允許經(jīng)過所有中轉(zhuǎn)頂點(diǎn),最后的兩點(diǎn)路徑更新:?

3、遍歷

//遍歷弗洛伊德算法
//確定begin -> end:從最近的前驅(qū)開始,一點(diǎn)一點(diǎn)往后追溯
void Traverse_Floyd()
{int medium = 0;for (int begin = 0; begin < length; begin++){for (int end = 0; end < length; end++){printf("\n%c", G.vertex[begin]);medium = P[begin][end];                     //開始追溯(此為最近的前驅(qū))while (medium != end)						//未追溯到尾{printf("->%c", G.vertex[medium]);		//打印中間結(jié)點(diǎn)medium = P[medium][end];				//向后追溯}}}
}

4、代碼

//弗洛伊德(Floyd)算法
/*測試案例
ABCDEFGHI
B 1 C 5
A 1 C 3 D 7 E 5
A 5 B 3 E 1 F 7
B 7 E 2 G 3
B 5 C 1 F 3 H 9 G 6 D 2
C 7 E 3 H 5
D 3 E 6 H 2 I 7
F 5 E 9 G 2 I 4
G 7 H 4
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>#define MAXSIZE 20
#define MAX 65535							//代表無窮大
int length = 0;									//頂點(diǎn)個數(shù)
int D[MAXSIZE][MAXSIZE];		//存放頂點(diǎn)之間的權(quán)
int P[MAXSIZE][MAXSIZE];		//存放頂點(diǎn)之間的前驅(qū)(中間結(jié)點(diǎn))//圖(頂點(diǎn)和權(quán))
typedef struct
{char vertex[MAXSIZE];int weight[MAXSIZE][MAXSIZE];			//權(quán)可以代替邊(自身為0,相連有值,不相連無窮大)
}Graph;
Graph G;//輸入頂點(diǎn)
void InputVertex()
{int i;char ch;printf("請輸入圖的頂點(diǎn):\n");scanf("%c", &ch);for (i = 0; i < MAXSIZE && ch != '\n'; i++){G.vertex[i] = ch;scanf("%c", &ch);}length = i;
}//圖權(quán)重初始化
void GraphWeightInit()
{int i, j;for (i = 0; i < length; i++){for (j = 0; j < length; j++){if (i == j)							//指向自己G.weight[i][j] = 0;elseG.weight[i][j] = MAX;	//無窮大}}
}//根據(jù)數(shù)據(jù)查找圖頂點(diǎn)下標(biāo)
int FindIndex(char ch)
{int i;for (i = 0; i < length; i++){if (G.vertex[i] == ch)return i;}return -1;
}//創(chuàng)建圖
void CreateGraph()
{int i, j, index, weight;char ch;for (i = 0; i < length; i++){printf("請輸入%c的鄰接頂點(diǎn)及權(quán)重(空格分隔,換行結(jié)束):\n", G.vertex[i]);scanf("%c", &ch);while (ch != '\n'){while (ch == ' ')				//為空格{scanf("%c", &ch);			//輸入字符continue;}index = FindIndex(ch);scanf("%d", &weight);		//輸入權(quán)重while (weight == 32)		//32為空格的ASCII碼{scanf("%d", &weight);continue;}G.weight[i][index] = weight;	//存入權(quán)重scanf("%c", &ch);				//(下一輪)輸入字符}}
}//弗洛伊德算法
void Floyd()
{int medium, begin, end;//初始化矩陣for (int i = 0; i < length; i++)for (int j = 0; j < length; j++){D[i][j] = G.weight[i][j];P[i][j] = j;}//開始正式修改(最短路徑及前驅(qū))for (medium = 0; medium < length; medium++)	//中間結(jié)點(diǎn)for (begin = 0; begin < length; begin++)			//前驅(qū)結(jié)點(diǎn)for (end = 0; end < length; end++)				//后繼結(jié)點(diǎn){//經(jīng)過中間結(jié)點(diǎn)路徑更小,則1、需要覆蓋掉原來的路徑;2、替換掉前驅(qū)(中間結(jié)點(diǎn))if (D[begin][end] > (D[begin][medium] + D[medium][end])){D[begin][end] = D[begin][medium] + D[medium][end];		//覆蓋路徑(只達(dá)標(biāo)的話,只要這一句就夠了)P[begin][end] = P[begin][medium];										//更新前驅(qū)(中間結(jié)點(diǎn))//不能直接賦值medium:跨越結(jié)點(diǎn)之間的追溯,存放的是最近前驅(qū),需要一個一個往后追溯}}
}//測試矩陣輸出
void PrintArray()
{//遍歷輸出printf("遍歷輸出D矩陣(最短路徑):\n");for (int i = 0; i < length; i++){printf("\n");for (int j = 0; j < length; j++){printf("%3d", D[i][j]);}}printf("\n遍歷輸出P矩陣(前驅(qū)):\n");for (int i = 0; i < length; i++){printf("\n");for (int j = 0; j < length; j++){printf("%3d", P[i][j]);}}
}//遍歷弗洛伊德算法
//確定begin -> end:從最近的前驅(qū)開始,一點(diǎn)一點(diǎn)往后追溯
void Traverse_Floyd()
{int medium = 0;for (int begin = 0; begin < length; begin++){for (int end = 0; end < length; end++){printf("\n%c", G.vertex[begin]);medium = P[begin][end];						//開始追溯(此為最近的前驅(qū))while (medium != end)							//未追溯到尾{printf("->%c", G.vertex[medium]);		//打印中間結(jié)點(diǎn)medium = P[medium][end];				//向后追溯}}}
}//輸出測試
void Print()
{for (int i = 0; i < length; i++){printf("\n%c結(jié)點(diǎn)鄰接結(jié)點(diǎn):\t", G.vertex[i]);for (int j = 0; j < length; j++){if (G.weight[i][j] != 0 && G.weight[i][j] != MAX)		//有鄰接結(jié)點(diǎn){printf("%c %d\t", G.vertex[j], G.weight[i][j]);}}}
}int main()
{InputVertex();			//輸入頂點(diǎn)GraphWeightInit();		//圖權(quán)重初始化CreateGraph();			//創(chuàng)建圖Floyd();				//弗洛伊德算法(生成最短路徑)Traverse_Floyd();		//遍歷弗洛伊德算法//PrintArray();			//測試弗洛伊德矩陣輸出//Print();				//測試輸出return 0;
}



參考資料

《大話數(shù)據(jù)結(jié)構(gòu)》?

https://www.bilibili.com/video/BV1uX4y137Hf?from=search&seid=9442880507495572891

https://blog.csdn.net/jeffleo/article/details/53349825?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162842804216780271587280%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162842804216780271587280&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-53349825.pc_search_result_control_group&utm_term=%E5%BC%97%E6%B4%9B%E4%BC%8A%E5%BE%B7%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187

https://blog.csdn.net/yuewenyao/article/details/81021319?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162842804216780271587280%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162842804216780271587280&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-81021319.pc_search_result_control_group&utm_term=%E5%BC%97%E6%B4%9B%E4%BC%8A%E5%BE%B7%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187

https://zhuanlan.zhihu.com/p/33162490?

總結(jié)

以上是生活随笔為你收集整理的数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品国产91久久久久久久妲己 | 成人国产一区 | 少妇高潮惨叫久久久久久 | 久久最新网址 | 中文字幕免费高清视频 | 后宫秀女调教(高h,np) | 日韩精品在线视频观看 | 国产成人无码av | 久久永久免费视频 | www.亚洲一区二区 | 亚洲精品久久久久久久蜜桃 | 91成人免费在线观看视频 | 中文字幕一区二区人妻视频 | 久久久久久国产精品日本 | 欧美爱爱视频 | 黄黄的视频在线观看 | 少女与动物高清版在线观看 | 国产乱子伦精品无码码专区 | 91精品国产91久久久久久 | gogo亚洲国模私拍人体 | 国产亚洲精久久久久久无码苍井空 | 黑人巨大精品一区二区在线 | 午夜免费毛片 | 欧美成人vr18sexvr | 奇米第四色7777 | 成人宗合网 | 久久亚洲AV成人无码国产人妖 | 麻豆毛片| 成人aaaa| 免费啪| 日韩一区二区三区视频 | 一个人看的www日本高清视频 | 中文字幕精品一区二区三区视频 | 欧美激情国产日韩精品一区18 | 亚洲国产精品久久人人爱 | 91精品国产综合久久久久久久 | 新天堂网 | 亚洲黄色在线视频 | 日韩欧美网站 | 99久久精品无免国产免费 | 国产福利网 | 欧美在线观看一区二区三区 | 黄色在线观看www | 亲切的金子片段 | 福利在线国产 | 亚洲成人午夜在线 | 亚洲成a人 | 五月av综合av国产av | www.我爱av| 日韩av在线一区 | 亚洲视频手机在线 | 天海翼一区二区三区 | 国产精品久久中文字幕 | 中文国产视频 | 亚洲艹 | 国产成人在线一区二区 | 一区二区三区欧美视频 | 色多多网站 | 亚洲国产精品国自产拍av | 日韩精品一区二区三区网站 | 欧美成人综合在线 | 久久精品无码Av中文字幕 | 97精品| 老熟女毛茸茸浓毛 | 99久久久国产精品无码网爆 | 国产在线观看一区 | 欧美午夜一区二区 | 欧美色综合天天久久综合精品 | 午夜av在线免费观看 | 国产ts变态重口人妖hd | 久久国产日韩 | 长河落日电视连续剧免费观看01 | av伦理在线 | 波多野结衣电影免费观看 | 国产日本一区二区三区 | 在线黄色大片 | 天天久| 黄色成人在线免费观看 | 精品久久久久久中文字幕 | 国产精品久久久久久白浆 | 亚洲人xxxx| 国产超碰在线 | 僵尸叔叔在线观看国语高清免费观看 | 久久久精品一区 | 国产精品一区二区入口九绯色 | 日本一本视频 | 污污动态图 | 久久久久人妻一区 | 九色丨蝌蚪丨成人 | 中文文字幕文字幕高清 | 91久久综合精品国产丝袜蜜芽 | 欧美精品一区二区蜜臀亚洲 | aa视频在线 | 美日韩免费视频 | 国产精品影院在线观看 | 91午夜精品亚洲一区二区三区 | 理论片在线观看理伦片 | 粉嫩小箩莉奶水四溅在线观看 | 欧美少妇15p |