(轉(zhuǎn))什么是P問題、NP問題和NPC問題

經(jīng)常會(huì)看到P問題,NP問題這種說法,但是一直難以理解。這次讀到了這篇文章,一下子清晰了起來。

你會(huì)經(jīng)常看到網(wǎng)上出現(xiàn)“這怎么做,這不是NP問題嗎”、“這個(gè)只有搜了,這已經(jīng)被證明是NP問題了”之類的話。你要知道,大多數(shù)人此時(shí)所說的NP問題其實(shí)都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題并不是那種“只有搜才行”的問題,NPC問題才是。好,行了,基本上這個(gè)誤解已經(jīng)被澄清了。下面的內(nèi)容都是在講什么是P問題,什么是NP問題,什么是NPC問題,你如果不是很感興趣就可以不看了。接下來你可以看到,把NP問題當(dāng)成是 NPC問題是一個(gè)多大的錯(cuò)誤。

還是先用幾句話簡(jiǎn)單說明一下時(shí)間復(fù)雜度。時(shí)間復(fù)雜度并不是表示一個(gè)程序解決問題需要花多少時(shí)間,而是當(dāng)問題規(guī)模擴(kuò)大后,程序需要的時(shí)間長(zhǎng)度增長(zhǎng)得有多快。也就是說,對(duì)于高速處理數(shù)據(jù)的計(jì)算機(jī)來說,處理某一個(gè)特定數(shù)據(jù)的效率不能衡量一個(gè)程序的好壞,而應(yīng)該看當(dāng)這個(gè)數(shù)據(jù)的規(guī)模變大到數(shù)百倍后,程序運(yùn)行時(shí)間是否還是一樣,或者也跟著慢了數(shù)百倍,或者變慢了數(shù)萬倍。不管數(shù)據(jù)有多大,程序處理花的時(shí)間始終是那么多的,我們就說這個(gè)程序很好,具有O(1)的時(shí)間復(fù)雜度,也稱常數(shù)級(jí)復(fù)雜度;數(shù)據(jù)規(guī)模變得有多大,花的時(shí)間也跟著變得有多長(zhǎng),這個(gè)程序的時(shí)間復(fù)雜度就是O(n),比如找n個(gè)數(shù)中的最大值;而像冒泡排序、插入排序等,數(shù)據(jù)擴(kuò)大2倍,時(shí)間變慢4倍的,屬于O(n2)的復(fù)雜度。還有一些窮舉類的算法,所需時(shí)間長(zhǎng)度成幾何階數(shù)上漲,這就是O(an)的指數(shù)級(jí)復(fù)雜度,甚至O(n!)的階乘級(jí)復(fù)雜度。不會(huì)存在O(2*n^2)的復(fù)雜度,因?yàn)榍懊娴哪莻€(gè)“2”是系數(shù),根本不會(huì)影響到整個(gè)程序的時(shí)間增長(zhǎng)。同樣地,O (n3+n2)的復(fù)雜度也就是O(n3)的復(fù)雜度。因此,我們會(huì)說,一個(gè)O(0.01*n3)的程序的效率比O(100*n2)的效率低,盡管在n很小的時(shí)候,前者優(yōu)于后者,但后者時(shí)間隨數(shù)據(jù)規(guī)模增長(zhǎng)得慢,最終O(n3)的復(fù)雜度將遠(yuǎn)遠(yuǎn)超過O(n2)。我們也說,O(n100)的復(fù)雜度小于O(1.01^n)的復(fù)雜度。

容易看出,前面的幾類復(fù)雜度被分為兩種級(jí)別,其中后者的復(fù)雜度無論如何都遠(yuǎn)遠(yuǎn)大于前者:一種是O(1),O(log(n)),O(na)等,我們把它叫做多項(xiàng)式級(jí)的復(fù)雜度,因?yàn)樗囊?guī)模n出現(xiàn)在底數(shù)的位置;另一種是O(an)和O(n!)型復(fù)雜度,它是非多項(xiàng)式級(jí)的,其復(fù)雜度計(jì)算機(jī)往往不能承受。當(dāng)我們?cè)诮鉀Q一個(gè)問題時(shí),我們選擇的算法通常都需要是多項(xiàng)式級(jí)的復(fù)雜度,非多項(xiàng)式級(jí)的復(fù)雜度需要的時(shí)間太多,往往會(huì)超時(shí),除非是數(shù)據(jù)規(guī)模非常小。

自然地,人們會(huì)想到一個(gè)問題:會(huì)不會(huì)所有的問題都可以找到復(fù)雜度為多項(xiàng)式級(jí)的算法呢?很遺憾,答案是否定的。有些問題甚至根本不可能找到一個(gè)正確的算法來,這稱之為“不可解問題”(Undecidable Decision Problem)。The Halting Problem就是一個(gè)著名的不可解問題,在我的Blog上有過專門的介紹和證明。再比如,輸出從1到n這n個(gè)數(shù)的全排列。不管你用什么方法,你的復(fù)雜度都是階乘級(jí),因?yàn)槟憧偟糜秒A乘級(jí)的時(shí)間打印出結(jié)果來。有人說,這樣的“問題”不是一個(gè)“正規(guī)”的問題,正規(guī)的問題是讓程序解決一個(gè)問題,輸出一個(gè)“YES”或“NO”(這被稱為判定性問題),或者一個(gè)什么什么的最優(yōu)值(這被稱為最優(yōu)化問題)。那么,根據(jù)這個(gè)定義,我也能舉出一個(gè)不大可能會(huì)有多項(xiàng)式級(jí)算法的問題來:Hamilton回路。問題是這樣的:給你一個(gè)圖,問你能否找到一條經(jīng)過每個(gè)頂點(diǎn)一次且恰好一次(不遺漏也不重復(fù))最后又走回來的路(滿足這個(gè)條件的路徑叫做Hamilton回路)。這個(gè)問題現(xiàn)在還沒有找到多項(xiàng)式級(jí)的算法。事實(shí)上,這個(gè)問題就是我們后面要說的NPC問題。

下面引入P類問題的概念:如果一個(gè)問題可以找到一個(gè)能在多項(xiàng)式的時(shí)間里解決它的算法,那么這個(gè)問題就屬于P問題。P是英文單詞多項(xiàng)式的第一個(gè)字母。哪些問題是P類問題呢?通常NOI和NOIP不會(huì)出不屬于P類問題的題目。我們常見到的一些信息奧賽的題目都是P問題。道理很簡(jiǎn)單,一個(gè)用窮舉換來的非多項(xiàng)式級(jí)時(shí)間的超時(shí)程序不會(huì)涵蓋任何有價(jià)值的算法。 接下來引入NP問題的概念。這個(gè)就有點(diǎn)難理解了,或者說容易理解錯(cuò)誤。在這里強(qiáng)調(diào)(回到我竭力想澄清的誤區(qū)上),NP問題不是非P類問題。NP問題是指可以在多項(xiàng)式的時(shí)間里驗(yàn)證一個(gè)解的問題。NP問題的另一個(gè)定義是,可以在多項(xiàng)式的時(shí)間里猜出一個(gè)解的問題。比方說,我RP很好,在程序中需要枚舉時(shí),我可以一猜一個(gè)準(zhǔn)。現(xiàn)在某人拿到了一個(gè)求最短路徑的問題,問從起點(diǎn)到終點(diǎn)是否有一條小于100個(gè)單位長(zhǎng)度的路線。它根據(jù)數(shù)據(jù)畫好了圖,但怎么也算不出來,于是來問我:你看怎么選條路走得最少?我說,我RP很好,肯定能隨便給你指條很短的路出來。然后我就胡亂畫了幾條線,說就這條吧。那人按我指的這條把權(quán)值加起來一看,嘿,神了,路徑長(zhǎng)度98,比100小。于是答案出來了,存在比100小的路徑。別人會(huì)問他這題怎么做出來的,他就可以說,因?yàn)槲艺业搅艘粋€(gè)比100 小的解。在這個(gè)題中,找一個(gè)解很困難,但驗(yàn)證一個(gè)解很容易。驗(yàn)證一個(gè)解只需要O(n)的時(shí)間復(fù)雜度,也就是說我可以花O(n)的時(shí)間把我猜的路徑的長(zhǎng)度加出來。那么,只要我RP好,猜得準(zhǔn),我一定能在多項(xiàng)式的時(shí)間里解決這個(gè)問題。我猜到的方案總是最優(yōu)的,不滿足題意的方案也不會(huì)來騙我去選它。這就是NP問題。當(dāng)然有不是NP問題的問題,即你猜到了解但是沒用,因?yàn)槟悴荒茉诙囗?xiàng)式的時(shí)間里去驗(yàn)證它。下面我要舉的例子是一個(gè)經(jīng)典的例子,它指出了一個(gè)目前還沒有辦法在多項(xiàng)式的時(shí)間里驗(yàn)證一個(gè)解的問題。很顯然,前面所說的Hamilton回路是NP問題,因?yàn)轵?yàn)證一條路是否恰好經(jīng)過了每一個(gè)頂點(diǎn)非常容易。但我要把問題換成這樣:試問一個(gè)圖中是否不存在Hamilton回路。這樣問題就沒法在多項(xiàng)式的時(shí)間里進(jìn)行驗(yàn)證了,因?yàn)槌悄阍囘^所有的路,否則你不敢斷定它“沒有Hamilton回路”。 之所以要定義NP問題,是因?yàn)橥ǔV挥蠳P問題才可能找到多項(xiàng)式的算法。我們不會(huì)指望一個(gè)連多項(xiàng)式地驗(yàn)證一個(gè)解都不行的問題存在一個(gè)解決它的多項(xiàng)式級(jí)的算法。相信讀者很快明白,信息學(xué)中的號(hào)稱最困難的問題——“NP問題”,實(shí)際上是在探討NP問題與P類問題的關(guān)系。

很顯然,所有的P類問題都是NP問題。也就是說,能多項(xiàng)式地解決一個(gè)問題,必然能多項(xiàng)式地驗(yàn)證一個(gè)問題的解——既然正解都出來了,驗(yàn)證任意給定的解也只需要比較一下就可以了。關(guān)鍵是,人們想知道,是否所有的NP問題都是P類問題。我們可以再用集合的觀點(diǎn)來說明。如果把所有P類問題歸為一個(gè)集合P中,把所有 NP問題劃進(jìn)另一個(gè)集合NP中,那么,顯然有P屬于NP。現(xiàn)在,所有對(duì)NP問題的研究都集中在一個(gè)問題上,即究竟是否有P=NP?通常所謂的“NP問題”,其實(shí)就一句話:證明或推翻P=NP。 NP問題一直都是信息學(xué)的巔峰。巔峰,意即很引人注目但難以解決。在信息學(xué)研究中,這是一個(gè)耗費(fèi)了很多時(shí)間和精力也沒有解決的終極問題,好比物理學(xué)中的大統(tǒng)一和數(shù)學(xué)中的歌德巴赫猜想等。 目前為止這個(gè)問題還“啃不動(dòng)”。但是,一個(gè)總的趨勢(shì)、一個(gè)大方向是有的。人們普遍認(rèn)為,P=NP不成立,也就是說,多數(shù)人相信,存在至少一個(gè)不可能有多項(xiàng)式級(jí)復(fù)雜度的算法的NP問題。人們?nèi)绱藞?jiān)信P≠NP是有原因的,就是在研究NP問題的過程中找出了一類非常特殊的NP問題叫做NP-完全問題,也即所謂的 NPC問題。C是英文單詞“完全”的第一個(gè)字母。正是NPC問題的存在,使人們相信P≠NP。下文將花大量篇幅介紹NPC問題,你從中可以體會(huì)到NPC問題使P=NP變得多么不可思議。

為了說明NPC問題,我們先引入一個(gè)概念——約化(Reducibility,有的資料上叫“歸約”)。 簡(jiǎn)單地說,一個(gè)問題A可以約化為問題B的含義即是,可以用問題B的解法解決問題A,或者說,問題A可以“變成”問題B。《算法導(dǎo)論》上舉了這么一個(gè)例子。比如說,現(xiàn)在有兩個(gè)問題:求解一個(gè)一元一次方程和求解一個(gè)一元二次方程。那么我們說,前者可以約化為后者,意即知道如何解一個(gè)一元二次方程那么一定能解出一元一次方程。我們可以寫出兩個(gè)程序分別對(duì)應(yīng)兩個(gè)問題,那么我們能找到一個(gè)“規(guī)則”,按照這個(gè)規(guī)則把解一元一次方程程序的輸入數(shù)據(jù)變一下,用在解一元二次方程的程序上,兩個(gè)程序總能得到一樣的結(jié)果。這個(gè)規(guī)則即是:兩個(gè)方程的對(duì)應(yīng)項(xiàng)系數(shù)不變,一元二次方程的二次項(xiàng)系數(shù)為0。按照這個(gè)規(guī)則把前一個(gè)問題轉(zhuǎn)換成后一個(gè)問題,兩個(gè)問題就等價(jià)了。同樣地,我們可以說,Hamilton回路可以約化為TSP問題(Travelling Salesman Problem,旅行商問題):在Hamilton回路問題中,兩點(diǎn)相連即這兩點(diǎn)距離為0,兩點(diǎn)不直接相連則令其距離為1,于是問題轉(zhuǎn)化為在TSP問題中,是否存在一條長(zhǎng)為0的路徑。Hamilton回路存在當(dāng)且僅當(dāng)TSP問題中存在長(zhǎng)為0的回路。 “問題A可約化為問題B”有一個(gè)重要的直觀意義:B的時(shí)間復(fù)雜度高于或者等于A的時(shí)間復(fù)雜度。也就是說,問題A不比問題B難。這很容易理解。既然問題A能用問題B來解決,倘若B的時(shí)間復(fù)雜度比A的時(shí)間復(fù)雜度還低了,那A的算法就可以改進(jìn)為B的算法,兩者的時(shí)間復(fù)雜度還是相同。正如解一元二次方程比解一元一次方程難,因?yàn)榻鉀Q前者的方法可以用來解決后者。 很顯然,約化具有一項(xiàng)重要的性質(zhì):約化具有傳遞性。如果問題A可約化為問題B,問題B可約化為問題C,則問題A一定可約化為問題C。這個(gè)道理非常簡(jiǎn)單,就不必闡述了。 現(xiàn)在再來說一下約化的標(biāo)準(zhǔn)概念就不難理解了:如果能找到這樣一個(gè)變化法則,對(duì)任意一個(gè)程序A的輸入,都能按這個(gè)法則變換成程序B的輸入,使兩程序的輸出相同,那么我們說,問題A可約化為問題B。 當(dāng)然,我們所說的“可約化”是指的可“多項(xiàng)式地”約化(Polynomial-time Reducible),即變換輸入的方法是能在多項(xiàng)式的時(shí)間里完成的。約化的過程只有用多項(xiàng)式的時(shí)間完成才有意義。

好了,從約化的定義中我們看到,一個(gè)問題約化為另一個(gè)問題,時(shí)間復(fù)雜度增加了,問題的應(yīng)用范圍也增大了。通過對(duì)某些問題的不斷約化,我們能夠不斷尋找復(fù)雜度更高,但應(yīng)用范圍更廣的算法來代替復(fù)雜度雖然低,但只能用于很小的一類問題的算法。再回想前面講的P和NP問題,聯(lián)想起約化的傳遞性,自然地,我們會(huì)想問,如果不斷地約化上去,不斷找到能“通吃”若干小NP問題的一個(gè)稍復(fù)雜的大NP問題,那么最后是否有可能找到一個(gè)時(shí)間復(fù)雜度最高,并且能“通吃”所有的 NP問題的這樣一個(gè)超級(jí)NP問題?答案居然是肯定的。也就是說,存在這樣一個(gè)NP問題,所有的NP問題都可以約化成它。換句話說,只要解決了這個(gè)問題,那么所有的NP問題都解決了。這種問題的存在難以置信,并且更加不可思議的是,這種問題不只一個(gè),它有很多個(gè),它是一類問題。這一類問題就是傳說中的NPC 問題,也就是NP-完全問題。NPC問題的出現(xiàn)使整個(gè)NP問題的研究得到了飛躍式的發(fā)展。我們有理由相信,NPC問題是最復(fù)雜的問題。再次回到全文開頭,我們可以看到,人們想表達(dá)一個(gè)問題不存在多項(xiàng)式的高效算法時(shí)應(yīng)該說它“屬于NPC問題”。此時(shí),我的目的終于達(dá)到了,我已經(jīng)把NP問題和NPC問題區(qū)別開了。到此為止,本文已經(jīng)寫了近5000字了,我佩服你還能看到這里來,同時(shí)也佩服一下自己能寫到這里來。

NPC問題的定義非常簡(jiǎn)單。同時(shí)滿足下面兩個(gè)條件的問題就是NPC問題。首先,它得是一個(gè)NP問題;然后,所有的NP問題都可以約化到它。證明一個(gè)問題是 NPC問題也很簡(jiǎn)單。先證明它至少是一個(gè)NP問題,再證明其中一個(gè)已知的NPC問題能約化到它(由約化的傳遞性,則NPC問題定義的第二條也得以滿足;至于第一個(gè)NPC問題是怎么來的,下文將介紹),這樣就可以說它是NPC問題了。 既然所有的NP問題都能約化成NPC問題,那么只要任意一個(gè)NPC問題找到了一個(gè)多項(xiàng)式的算法,那么所有的NP問題都能用這個(gè)算法解決了,NP也就等于P 了。因此,給NPC找一個(gè)多項(xiàng)式算法太不可思議了。因此,前文才說,“正是NPC問題的存在,使人們相信P≠NP”。我們可以就此直觀地理解,NPC問題目前沒有多項(xiàng)式的有效算法,只能用指數(shù)級(jí)甚至階乘級(jí)復(fù)雜度的搜索。

順便講一下NP-Hard問題。NP-Hard問題是這樣一種問題,它滿足NPC問題定義的第二條但不一定要滿足第一條(就是說,NP-Hard問題要比 NPC問題的范圍廣)。NP-Hard問題同樣難以找到多項(xiàng)式的算法,但它不列入我們的研究范圍,因?yàn)樗灰欢ㄊ荖P問題。即使NPC問題發(fā)現(xiàn)了多項(xiàng)式級(jí)的算法,NP-Hard問題有可能仍然無法得到多項(xiàng)式級(jí)的算法。事實(shí)上,由于NP-Hard放寬了限定條件,它將有可能比所有的NPC問題的時(shí)間復(fù)雜度更高從而更難以解決。

不要以為NPC問題是一紙空談。NPC問題是存在的。確實(shí)有這么一個(gè)非常具體的問題屬于NPC問題。下文即將介紹它。 下文即將介紹邏輯電路問題。這是第一個(gè)NPC問題。其它的NPC問題都是由這個(gè)問題約化而來的。因此,邏輯電路問題是NPC類問題的“鼻祖”。 邏輯電路問題是指的這樣一個(gè)問題:給定一個(gè)邏輯電路,問是否存在一種輸入使輸出為True。 什么叫做邏輯電路呢?一個(gè)邏輯電路由若干個(gè)輸入,一個(gè)輸出,若干“邏輯門”和密密麻麻的線組成。看下面一例,不需要解釋你馬上就明白了。

回到上文,給定一個(gè)邏輯電路,問是否存在一種輸入使輸出為True,這即邏輯電路問題。 邏輯電路問題屬于NPC問題。這是有嚴(yán)格證明的。它顯然屬于NP問題,并且可以直接證明所有的NP問題都可以約化到它(不要以為NP問題有無窮多個(gè)將給證明造成不可逾越的困難)。證明過程相當(dāng)復(fù)雜,其大概意思是說任意一個(gè)NP問題的輸入和輸出都可以轉(zhuǎn)換成邏輯電路的輸入和輸出(想想計(jì)算機(jī)內(nèi)部也不過是一些 0和1的運(yùn)算),因此對(duì)于一個(gè)NP問題來說,問題轉(zhuǎn)化為了求出滿足結(jié)果為True的一個(gè)輸入(即一個(gè)可行解)。

有了第一個(gè)NPC問題后,一大堆NPC問題就出現(xiàn)了,因?yàn)樵僮C明一個(gè)新的NPC問題只需要將一個(gè)已知的NPC問題約化到它就行了。后來,Hamilton 回路成了NPC問題,TSP問題也成了NPC問題。現(xiàn)在被證明是NPC問題的有很多,任何一個(gè)找到了多項(xiàng)式算法的話所有的NP問題都可以完美解決了。因此說,正是因?yàn)镹PC問題的存在,P=NP變得難以置信。P=NP問題還有許多有趣的東西,有待大家自己進(jìn)一步的挖掘。攀登這個(gè)信息學(xué)的巔峰是我們這一代的終極目標(biāo)。現(xiàn)在我們需要做的,至少是不要把概念弄混淆了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,323評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,551評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,720評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,961評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,330評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,690評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容