首先是網路流問題的提出:
乙個源點,乙個匯點,不斷又源點向匯點輸送,其中路徑上有最大速度,求匯點收貨的最大速度是多少。
在求之前可以先模擬一下過程如果源點現在只能出乙個單位的貨,那麼他會找乙個未達到最大速度的路進行運輸,接著我們不斷將運輸的量放大,即不斷地從起點開始尋找增廣路,每次都對其進行增廣,直到源點和匯點不連通,也就是找不到增廣路為止。可知當找不到增廣路的時候,當前的流量就是最大流。
那麼像這種先擴張再找終點的情況可以用bfs來實現,即將點存在佇列裡。
但這樣找到的只是先從這條路開始找所找到的最大流,故應該是他在發現不是最大時具備回溯的能力,但回溯搜尋會使我們的效率就上公升到指數級,因此我們引入反向邊即每條邊(i,j)都有一條反向邊(j,i),反向邊也同樣有它的值,在把路上每一段的容量減少delta的同時,也把每一段上的反方向的容量增加delta。
這樣方法就有了,就差構建了
變數定義
#define maxn 201
int maxdata = 0x7fffffff;
int capacity[maxn][maxn]; //記錄殘留網路的值
int flow[maxn];//標記從源點到當前節點實際還剩多少流量可用
int pre[maxn];//標記在這條路徑上當前節點的前驅,同時標記該節點是否在佇列中
queue
ekqueue;
bfs搜尋
通過搜尋找出增廣路
int bfs(int src,int des)//bfs用來找由src到des的最大值
pre[src]=0;
flow[src]= maxdata;//源點的值是無限大
ekqueue.push(src);//將源點入隊
while(!ekqueue.empty())//bfs一直搜尋到沒有擴張點}}
if(pre[des]==-1)//殘留圖中不再存在增廣路徑,即找到了乙個最大流
return -1;
else
return flow[des];
}
接著我們將增廣後的增量新增到總價值裡
int maxflow(int src,int des)//最大流
sumflow += increasement;
}return sumflow;
}
這樣看可能還是不大好懂那麼我們以一組樣例為例:
「 5 4 」
「 1 4 20 」
「 1 2 40 」
「 2 4 20 」
」 2 3 30 」
」 3 4 10 」
對第一條邊:
1. flow[1]=inf,pre[1]=0;
源點1進佇列,開始找增廣路,
capacity[1][2]=40>0,則flow[2]=min(flow[1],40)=40;
capacity[1][4]=20>0,則flow[4]=min(flow[1],20)=20;
capacity[2][3]=30>0,則flow[3]=min(folw[2]=40,30)=30;
capacity[2][4]=30,但是pre[4]=1(已經在capacity[1][4]這遍歷過4號點了)
capacity[3][4].....
當index=4(匯點),結束增廣路的尋找
傳遞歸increasement(該路徑的流),利用前驅pre尋找路徑
這時由1到4出現了一條零路,由4到1的價值為20(反向邊)
2.flow[1]=inf,pre[1]=0;
源點1進佇列,開始找增廣路,capacity[1][2]=40>0,則flow[2]=min(flow[1],40)=40;
capacity[1][4]=0!>0,跳過
capacity[2][3]=30>0,則flow[3]=min(folw[2]=40,30)=30;
capacity[2][4]=30,pre[4]=2,
則flow[2][4]=min(flow[2]=40,20)=20;
capacity[3][4].....
當index=4(匯點),結束增廣路的尋找
傳遞歸increasement(該路徑的流),利用前驅pre尋找路徑
一直這樣搜下去
最終sumflow=20+20+10=50(這個就是最大流的值)
對Linux inode的一些理解
檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...
對棧的一些理解
之前總結過一篇有關函式棧幀的部落格 函式棧幀以及呼叫約定相關的一些總結 但是感覺自己還是有一點知識點沒有弄懂,今天中午跟郭哥吃過飯一起 有關殼的問題的時候,順便把這個問題請教了一下郭哥,終於弄明白了,在此要特地感謝他,這裡把一些心得體會寫出來 先看一幅圖 選自ida權威指南 注意圖中是基於esp的棧...
對SharedNothing的一些理解
share nothing 每乙個cpu都有私有記憶體區域和私有磁碟空間,而且2個cpu不能訪問相同磁碟空間,cpu之間的通訊通過網路連線。share memory 多個cpu共享同一片記憶體,cpu之間通過內部通訊機制 interconnection network 進行通訊 share disk...