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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

發(fā)布時(shí)間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最小生成樹

什么是最小生成樹

  • 是一棵
    - 無回路
    - |V|個(gè)頂點(diǎn)一定有|V|-1條邊
  • 生成
    - 包含全部頂點(diǎn)
    - |V|-1條邊全在圖里


貪心算法

什么是“貪”:每一步都要最好的
什么是“好”:權(quán)重最小的邊
需要約束:

  • 只能用圖里有的邊
  • 只能正好用掉|V|-1條邊
  • 不能有回路
  • 普利姆(Prim)算法——讓一棵小樹長大

    需要維護(hù)兩個(gè)數(shù)組:lowcost[n] 、adjvex[n](n是圖中的頂點(diǎn)數(shù))
    ①從圖中找第一個(gè)起始頂點(diǎn)v0,作為生成樹的第一個(gè)頂點(diǎn),然后從這個(gè)頂點(diǎn)到其他頂點(diǎn)的所有邊中選一條權(quán)值最小的邊。然后把這條邊的另一個(gè)頂點(diǎn)v和這條邊加入到生成樹中。
    ②對剩下的其他所有頂點(diǎn),分別檢查這些頂點(diǎn)與頂點(diǎn)v的權(quán)值是否比這些頂點(diǎn)在lowcost數(shù)組中對應(yīng)的權(quán)值小,如果更小,則用較小的權(quán)值更新lowcost數(shù)組。
    ③從更新后的lowcost數(shù)組中繼續(xù)挑選權(quán)值最小而且不在生成樹中的邊,然后加入到生成樹。
    ④反復(fù)執(zhí)行②③直到所有所有頂點(diǎn)都加入到生成樹中。
    視頻講解

    Void MiniSpanTree_Prim(MGraph G){int min,i,j,k;int adjvex[MAXVEX]; //保存鄰接頂點(diǎn)下標(biāo)的數(shù)組int lowcost[MAXVEX]; //記錄當(dāng)前生成樹到剩余頂點(diǎn)的最小權(quán)值lowcost[0]=0; //將0號頂點(diǎn)(以0號頂點(diǎn)作為第一個(gè)頂點(diǎn))加入生成樹adjvex[0]=0; //由于剛開始生成樹只有一個(gè)頂點(diǎn) 不存在邊 干脆都設(shè)為0for(i=1;i<G.vexnum;i++){ //除下標(biāo)為0以外的所有頂點(diǎn)lowcost[i]=G.arc[0][i]; //將與下標(biāo)為0的頂點(diǎn)有邊的權(quán)值存入Lowcost數(shù)組adjvex[i]=0; //這些頂點(diǎn)的adjvex數(shù)組全部初始化為0}//算法核心for(i=1;i<G.vexnum;i++){//只需要循環(huán)N-1次,N為頂點(diǎn)數(shù)min=65535; //tip:因?yàn)橐易钚≈?#xff0c;不妨先設(shè)取一個(gè)最大的值來比較j=0;k=0;//找出lowcost最小的 最小權(quán)值給min,下標(biāo)給kwhile(j<G.vexnum){ //從1號頂點(diǎn)開始找if(lowcost[j]!=0 && lowcost[j]<min){ //不在生成樹中的頂點(diǎn)而且權(quán)值更小的min=lowcost[j]; //更新更小的值k=j; //找到了新的點(diǎn)下標(biāo)給k}j++; //再看下一個(gè)頂點(diǎn)}printf(“(%d->%d)”,adjvex[k],k); //打印權(quán)值最小的邊lowcost[k]=0; //將這個(gè)頂點(diǎn)加入生成樹//生成樹加入了新的頂點(diǎn) 從下標(biāo)為1的頂點(diǎn)開始更新lowcost數(shù)組值for(j=0;j<G.vexnum;j++){ if(lowcost[j]!=0 && G.arc[k][j]<lowcost[j]){ //如果新加入樹的頂點(diǎn)k使得權(quán)值變小lowcost[j]=G.arc[k][j]; //更新更小的權(quán)值adjvex[j]=k; //修改這條邊鄰接的頂點(diǎn) 也就是表示這條邊是從選出的頂點(diǎn)k指過來的 方便打印 }}} }

    算法分析

    普利姆算法是雙重循環(huán),外層循環(huán)次數(shù)為n-1,內(nèi)層并列的兩個(gè)循環(huán)次數(shù)都是n。故普利姆算法時(shí)間復(fù)雜度為O(n2)
    而且時(shí)間復(fù)雜度只和n有關(guān),所以適合稠密圖

    克魯斯卡爾(Kruskal)算法——把森林合并成樹

    我們知道生成樹是包含n個(gè)頂點(diǎn),n-1條邊的
    換一種思路,我們可以從網(wǎng)中的邊這個(gè)角度,找最小權(quán)值的邊,直到找到n-1條邊。

    思路

    將圖中邊按照權(quán)值從小到大排列,然后從最小的邊開始掃描,設(shè)置一個(gè)邊的集合來記錄,如果該邊并入不構(gòu)成回路的話,則將該邊并入當(dāng)前生成樹。直到所有的邊都檢測完為止。

    排列: 請參考→ 堆
    不構(gòu)成回路:請參考→ 并查集

    #define MaxSize 100 typedef struct {int a,b; //邊的兩個(gè)頂點(diǎn)int weight; //邊的權(quán)值 }Edge; //邊結(jié)構(gòu)體 int Find(int *parent,int x){while(parent[x]>=0) x=parent[x]; //循環(huán)向上尋找下標(biāo)為x頂點(diǎn)的根return x; //while循環(huán)結(jié)束時(shí)找到了根的下標(biāo) } Edge edges[MaxEdge]; //邊數(shù)組 int parent[MaxVex]; //父親頂點(diǎn)數(shù)組(并查集) Void MiniSpanTree_Kruskal(MGraph G){int i , n , m;sort(edges); //按權(quán)值由小到大對邊排列(省略了細(xì)節(jié))for(i=0 ; i<G.vexnum ; i++)parent[i]=-1; //初始化:各個(gè)頂點(diǎn)單獨(dú)形成一個(gè)集合for(i=0 ; i<G.arcnum ; i++){ //掃描每條邊n=Find(parent,edges[i].a); //n是這條邊第一個(gè)頂點(diǎn)的根頂點(diǎn)所在下標(biāo)m=Find(parent,edges[i].b); //m是這條邊第二個(gè)頂點(diǎn)的根頂點(diǎn)所在下標(biāo)if(n!=m){ //根頂點(diǎn)不相同 這條邊不會(huì)構(gòu)成環(huán)parent[n]=m; //并操作//作為生成樹的一條邊打印出來printf(“(%d->%d) ”,edges[i].a,edges[i].b); }} }

    看一個(gè)例子,視頻講解

    克魯斯卡爾算法操作分為對邊的權(quán)值排序部分和一個(gè)單重for循環(huán),它們是并列關(guān)系,由于排序耗費(fèi)時(shí)間大于單重循環(huán),所以克魯斯卡爾算法的主要時(shí)間耗費(fèi)在排序上。排序和圖中邊的數(shù)量有關(guān)系,所以適合稀疏圖。

    最短路徑

    問題分類

    單源最短路徑問題:從某固定源點(diǎn)出發(fā),求其到所有其他頂點(diǎn)的最短路徑
    多源最短路徑問題:求任意兩頂點(diǎn)間的最短路徑

    迪杰斯特拉算法

    該算法設(shè)置一個(gè)集合S記錄已求得的最短路徑的頂點(diǎn),可用一個(gè)數(shù)組s[]來實(shí)現(xiàn),初始化為0,當(dāng)s[vi]=1時(shí)表示將頂點(diǎn)vi放入S中,初始時(shí)把源點(diǎn)v0放入S中。此外,在構(gòu)造過程中還設(shè)置了兩個(gè)輔助數(shù)組:
    dist[]:記錄了從源點(diǎn)v0到其他各頂點(diǎn)當(dāng)前的最短路徑長度,dist[i]初值為arcs[v0][i]。
    path[]:path[i]表示從源點(diǎn)到頂點(diǎn)i之間的最短路徑的前驅(qū)結(jié)點(diǎn),在算法結(jié)束時(shí),可根據(jù)其值追溯得到源點(diǎn)v0到頂點(diǎn)vi的最短路徑。

    假設(shè)從頂點(diǎn)0出發(fā),也就是頂點(diǎn)0為源點(diǎn),集合S最初只包含頂點(diǎn)0,鄰接矩陣arcs表示帶權(quán)有向圖,arcs[i][j]表示有向邊<i,j>的權(quán)值,若不存在有向邊<i,j>,則arcs[i][j]為∞。Dijkstra算法的步驟如下:
    1)初始化:集合S初始為{0},dist[]的初始值dist[i]=arcs[0][i],i=1,2,…,n-1。
    2)找出dist[]中的最小值dist[j],將頂點(diǎn)j加入集合S,即修改s[vj]=1。
    3)修改從v0出發(fā)到集合V-S上任一頂點(diǎn)vk可達(dá)的最短路徑長度:如果dist[j] + arcs[j][k]< dist[k],則令dist[k]=dist[j] + arcs[j][k]。另外更新path[k]=j(也就是頂點(diǎn)j加入集合之后如果有新的路徑使得到頂點(diǎn)k路徑變短的話就將到頂點(diǎn)k的路徑長度修改成較短的)
    4)重復(fù)2)~3)操作共n-1次,直到所有的頂點(diǎn)都包含在S中。

    具體過程可參考 視頻講解

    Void Dijkstra(MGraph G,int v,int path[ ],int dist[ ]){ //v是源點(diǎn)的下標(biāo) int s[maxSize]; //數(shù)組s記錄當(dāng)前找到了到哪些頂點(diǎn)的最短路徑 找到了對應(yīng)值為1 沒找的對應(yīng)值為0int i,j,min,u; //初始化 將path dist s 數(shù)組的初值確定for(i=0 ; i<G.vexnum ; i++){dist[i]=G.edge[v][i]; //dist初值為源點(diǎn)到各個(gè)頂點(diǎn)的邊的權(quán)值s[i]=0; //一開始沒有一個(gè)頂點(diǎn)if(G.edge[v][i]<65535)path[i]=v; //與源點(diǎn)連通的頂點(diǎn)的path值存源點(diǎn)下標(biāo)else path[i]=-1;//剛開始到源點(diǎn)沒有路徑的頂點(diǎn)path值為-1}s[v]=1; //源點(diǎn)加入集合spath[v]=-1; //源點(diǎn)不存在到自身的路徑//下面的循環(huán)中包含兩部分作用://①內(nèi)層第一個(gè)for循環(huán)是找到 到剩余頂點(diǎn)中距離最小的 頂點(diǎn)u 并把它加入最短路徑//②內(nèi)層第二個(gè)for循環(huán)是由新加入的頂點(diǎn)u來判斷是否找到了新的更短路徑,如果有就更新,沒有就不做任何操作for(i=0;i<G.vexnum;i++){min=65535;for(j=0;j<G.vexnum;j++){if(s[j]==0&&dist[j]<min){ //從剩余的頂點(diǎn)中找到距離最小的頂點(diǎn)u=j; //u用于保存當(dāng)前找到的距離最小的頂點(diǎn)下標(biāo) 當(dāng)循環(huán)結(jié)束u保存的就是最小距離的頂點(diǎn)下標(biāo)min=dist[j]; }}s[u]=1;//到u的距離是最小的,所以把頂點(diǎn)u加入最短路徑for(i=0;i<G.vexnum;i++){min=65535;for(j=0;j<G.vexnum;j++){if(s[j]==0&&dist[j]<min){ //從剩余的頂點(diǎn)中找到距離最小的頂點(diǎn)u=j; //u用于保存當(dāng)前找到的距離最小的頂點(diǎn)下標(biāo) 當(dāng)循環(huán)結(jié)束u保存的就是最小距離的頂點(diǎn)下標(biāo)min=dist[j]; }} s[u]=1;//到u的距離是最小的,所以把頂點(diǎn)u加入最短路徑for(j=0;j<G.vexnum;j++){if(s[j]==0 && dist[u]+G.Edges[u][j]<dist[j]){dist[j]=dist[u]+G.Edges[u][i];//如果由新加入最短路徑的頂點(diǎn)u到其他剩余頂點(diǎn)的距離變短了則//修改到剩余頂點(diǎn)的距離為較小值 path[j]=u;//這條較短的路徑是由頂點(diǎn)u過來的 } }}} }
    時(shí)間復(fù)雜度

    迪杰斯特拉算法的核心部分在于一個(gè)雙重循環(huán),這個(gè)雙重循環(huán)的內(nèi)循環(huán)又是兩個(gè)并列的單重for循環(huán)組成(找距離最小頂點(diǎn)和更新距離),任意取其中一個(gè)循環(huán)中的操作為基本操作,都可以得出迪杰斯特拉算法的時(shí)間復(fù)雜度為O(n2) 其中n為圖中的頂點(diǎn)數(shù)。
    迪杰斯特拉算法不能用于權(quán)值有負(fù)數(shù)的圖,不然結(jié)果會(huì)出錯(cuò)!

    弗洛伊德算法

    算法思想

    遞推產(chǎn)生一個(gè)n階方陣序列A(?1),A(0),…,A(k),…,A(n?1)
    其中A(k)[i][j]表示從頂點(diǎn)vi到頂點(diǎn)vj的路徑長度,k表示繞行第k個(gè)頂點(diǎn)的運(yùn)算步驟。初始時(shí),對于任意兩個(gè)頂點(diǎn)vi和vj,若它們之間存在邊,則以此邊上的權(quán)值作為它們之間的最短路徑長度;若它們之間不存在有向邊,則以∞作為它們之間的最短路徑長度。以后逐步嘗試在原路徑中加入頂點(diǎn)k(k=0,1,…,n-1)作為中間頂點(diǎn)。如果增加中間頂點(diǎn)后,得到的路徑比原來的路徑長度減少了,則以此新路徑代替原路徑。

    void Floyd(MGraph G,int Path[][]){int i, j, k ;int A[MaxSize][MaxSize];//對數(shù)組A[][]和Path[][]進(jìn)行初始化for(i=0; i<G.vexnums; i++){for(j=0; j<G.vexnums; j++){A[i][j]=G.Edges[i][j];Path[i][j]=-1;}}for(k=0; k<G.vexnums; k++){for(i=0; i<G.vexnums; i++){for(j=0; j<G.vexnums; j++){if(A[i][j]>A[i][k]+A[k][j]){//如果頂點(diǎn)i到頂點(diǎn)j的距離比頂點(diǎn)i經(jīng)過頂點(diǎn)k到頂點(diǎn)j的距離長,則更新從頂點(diǎn)i到頂點(diǎn)j的距離為較小值,并且存儲k表示路徑經(jīng)過頂點(diǎn)kA[i][j]=A[i][k]+A[k][j];Path[i][j]=k;}}}} }

    弗洛伊德算法的核心為一個(gè)三重循環(huán),所以時(shí)間復(fù)雜度為O(n3) 其中n是圖中的頂點(diǎn)數(shù)。

    拓?fù)渑判?/h3>

    AOV

    如果我們把每個(gè)環(huán)節(jié)看成圖中一個(gè)頂點(diǎn),在這樣一個(gè)有向圖中,用頂點(diǎn)表示活動(dòng),用弧表示活動(dòng)之間的優(yōu)先關(guān)系,那么這樣的有向圖稱為AOV網(wǎng)(Activity On Vertex)
    由于弧是用來表示活動(dòng)之間的優(yōu)先關(guān)系,或者說AOV網(wǎng)具有實(shí)際的意義,那么AOV網(wǎng)顯然是不能有回路的
    有向無環(huán)圖也叫做DAG圖

    拓?fù)湫蛄惺菍D中所有的頂點(diǎn),如果存在一條從頂點(diǎn)A到頂點(diǎn)B的路徑,那么在排序中頂點(diǎn)A出現(xiàn)在頂點(diǎn)B的前面。

    拓?fù)渑判蚓褪菍σ粋€(gè)有向圖構(gòu)造拓?fù)湫蛄械倪^程,構(gòu)造會(huì)有兩種結(jié)果:

  • 如果此圖全部頂點(diǎn)都被輸出了,說明它是不存在回路的AOV網(wǎng);
  • 如果沒有輸出全部頂點(diǎn),則說明這個(gè)圖存在回路,不是AOV網(wǎng)。
  • 拓?fù)渑判蛩惴?/h4>

    從AOV網(wǎng)中選擇一個(gè)入度為0的頂點(diǎn)輸出,然后刪去此頂點(diǎn),并刪除以此頂點(diǎn)為弧尾的弧。重復(fù)這個(gè)步驟直到輸出圖中全部頂點(diǎn),或者找不到入度為0的頂點(diǎn)為止。
    一個(gè)DAG的拓?fù)渑判虿晃ㄒ?br /> 由于拓?fù)渑判蛐枰獎(jiǎng)h除邊和頂點(diǎn),所以使用鄰接表存儲圖比較方便。

    bool TopologicalSort(Graph G){InitStack(S); //初始化棧,存儲入度為0的頂點(diǎn)for(int i=0;i<G.vexnum;i++)if(indegree[i]==0)Push(S,i); //將所有入度為0的頂點(diǎn)進(jìn)棧int count=0; //計(jì)數(shù),記錄當(dāng)前已經(jīng)輸出的頂點(diǎn)數(shù)while(!IsEmpty(S)){ //棧不空,則存在入度為0的頂點(diǎn)Pop(S,i); //棧頂元素出棧pritnf(“%d”,G.adjlist[i]);for(ArcNode *p=G.vertices[i].firstarc; p; p=p->nextarc){v=p->adjvex; //取這條弧指向的頂點(diǎn)if(!(--indegree[v]))Push(S,v); //入度減1為0,則入棧}}if(count<G.vexnum)return false; //排序失敗,有向圖中有回路else return true; //拓?fù)渑判虺晒?}

    拓?fù)渑判驅(qū)OV圖需要打印圖中所有頂點(diǎn),而且由于要?jiǎng)h除邊(實(shí)際沒有刪除,只是尋找入度為0的頂點(diǎn))所以對所有邊也要進(jìn)行掃描,所以這個(gè)算法的時(shí)間復(fù)雜度為O(∣V∣+∣E∣)O (|V|+|E|)O(V+E)

  • 拓?fù)渑判驈娜攵葹?的頂點(diǎn)開始篩選,對應(yīng)的實(shí)際意義是工程可以從這個(gè)活動(dòng)開始或者繼續(xù)。
  • 拓?fù)湫蛄锌梢圆晃ㄒ?#xff0c;當(dāng)活動(dòng)排成線性,則拓?fù)湫蛄惺俏ㄒ坏摹?/li>
  • 對于一般的圖,如果它的鄰接矩陣是三角矩陣,則存在拓?fù)湫蛄?#xff1b;反之則不一定成立
    只要按照序號從小到大或者從大到小的順序就能得到這個(gè)鄰接矩陣為三角矩陣的圖的拓?fù)湫蛄小?/li>

    上三角:0 1 2 3 下三角:3 2 1 0

    關(guān)鍵路徑

    AOE(Activity On Edge):在一個(gè)表示工程的帶權(quán)有向圖中,用頂點(diǎn)表示事件,用有向邊表示活動(dòng),用邊上的權(quán)值表示活動(dòng)的持續(xù)時(shí)間,這種有向圖的邊表示活動(dòng)的網(wǎng)稱為AOE網(wǎng)。

    活動(dòng)是在邊上,邊上的權(quán)值表示的是這個(gè)活動(dòng)所需要耗費(fèi)的時(shí)間。AOE網(wǎng)是在AOE的基礎(chǔ)上來分析工程的最少需要時(shí)間。或者是為了縮短工期,需要找出哪些活動(dòng)是要加快的。
    開始時(shí)間為0 設(shè)定造好各個(gè)模塊的時(shí)間為5 因?yàn)樽铋L路徑為5
    造輪子最早發(fā)生的時(shí)間:0 最晚發(fā)生的時(shí)間:3
    造零件最早發(fā)生的時(shí)間:0 最晚發(fā)生的時(shí)間:4
    造發(fā)動(dòng)機(jī)最早發(fā)生的時(shí)間:0 最晚發(fā)生的時(shí)間:0
    關(guān)鍵活動(dòng)的最早發(fā)生時(shí)間和最晚發(fā)生時(shí)間是一樣的!

    例子:



    參考資料

    王道數(shù)據(jù)結(jié)構(gòu)

    超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

  • 主站蜘蛛池模板: 日本中文字幕在线 | 日本一区二区高清免费 | 动漫女生光屁股 | 亚洲国产精品二区 | 在线观看亚洲区 | 五月婷婷色丁香 | 91jk制服白丝超短裙大长腿 | 亚洲国内自拍 | 国产精品99久久久久久动医院 | 免费在线播放黄色片 | 欧美hdse| 韩国午夜影院 | 91蜜桃在线观看 | 黄色一级视频 | 九九亚洲视频 | 久久久久久久久久久久久久av | 中文字幕在线观看视频www | 爱爱短视频 | 乱子伦一区二区三区 | 狠狠躁18三区二区一区视频 | 美女扒开腿让男生捅 | 成人黄色免费网站 | 欧美一区二区公司 | 特级做a爱片免费69 少妇第一次交换又紧又爽 亚洲大胆人体 | 国产调教打屁股xxxx网站 | 欧美.www| 嫩草国产 | 牛牛在线 | 久久久精品久久久久久 | 日韩精品一区二区在线 | 欧美大喷水吹潮合集在线观看 | 99婷婷 | 亚洲а∨天堂久久精品2021 | 亚洲精品无吗 | 国产妇女视频 | a天堂在线观看视频 | 人妻激情偷乱频一区二区三区 | a级片免费网站 | 成人免费区一区二区三区 | 国产免费观看久久黄av片 | 国产精品嫩| 欧美人与禽zozzozzo | 一区二区三区免费观看视频 | 国产网站在线看 | 国产黄色一区二区 | av电影在线不卡 | 欧美黑人一级 | 初尝黑人巨炮波多野结衣 | 久久久久久91香蕉国产 | 911香蕉视频 | 久久综合桃花网 | 性一交一乱一区二区洋洋av | 写真福利片hd在线播放 | 永久免费看片 | 欧美久久久久久久久 | 日精品 | 国产成人精品一区二 | 免费视频精品 | 国产又黄又爽又色 | 亚洲精品二三区 | 成人a级免费视频 | 成年人91视频 | 91黑丝美女 | 91官网在线观看 | 国产欧美一区二区三区另类精品 | 好姑娘在线观看高清完整版电影 | 成人黄色一级视频 | 亚洲a中文字幕 | 欧美一级二级在线观看 | 草草国产 | 久久婷婷五月综合色吧 | 97国产精品久久久 | 成人在线免费播放 | 天堂av资源网 | 一区二区三区 中文字幕 | 欧美黄色小视频 | 波多野结衣精品视频 | 免费看一级一片 | 日韩中文字幕网 | www久久com | 久久美利坚 | www久久精品 | 亚洲AV午夜福利精品一级无码 | 97夜夜| 波多野结衣av中文字幕 | 天堂成人在线视频 | 四虎免看黄 | 日本一区二区不卡视频 | av观看国产 | 91成人在线免费 | 四虎国产精品永久免费观看视频 | 综合色小说 | 插插插色综合 | 无码国产69精品久久久久网站 | 精品xxx| 国产a久久 | 国产激情无套内精对白视频 | 久久av资源 | 免费不卡av在线 |