從零單練網路流 第三章 有上下界的可行流

2021-06-26 03:09:43 字數 1528 閱讀 1622

可行流無非就是把給定的一些條件轉化為最大流可以完成的任務,著名的題目有sgu上的兩道題p194 reactor cooling和p176 flow construction。第一題我本想依靠自己想出最大流的模型,不過最後還是看了題解。

這裡簡要講一下p

194 reactor cooling這道題的解法,這題在acdream上也有,p1211。題意大概為給你n個點,m條邊,每條邊有上下界流,然後要保證每個點出流和入流一樣。

建立超級源st和超級匯tr,對於每條邊的容量為自己上下界流之差,記錄每個點入出流情況。假如入流多,那st到該點加一條邊即多出來的入流,反之,就該點引邊向tr,值是這個絕對值。至於為什麼這樣,只有自己模擬一遍,自己說服自己了,說實在是說不清楚。不過有一點可以幫助你理解,這道題判斷是否可行,是要st每條邊都滿流,之前因為st的邊是由入流情況決定的,而其他邊是上下界之差,即其他邊是忽略了下界的判斷的,那所有關於下界的判斷全部集中於st引出的邊,st引出的邊正是保證他們下界之上的關鍵,而上下界之差的邊則控制了上界。那為什麼st引出的邊保證了他們下界之上呢?因為假如每條邊都是下界,那有些點必溢位,這些溢位的流則由超級源提供了。上下界之差控制上界應該好理解。

你理解了嗎?

reactor cooling的**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#define rep(i,n) for(i=1;i<=n;i++)

#define mm(a,t) memset(a,t,sizeof(a))

#define inf 1e9

typedef long long ll;

#define mod 1000000007

using namespace std;

int n,m,np,nc,st,tr;

int res;

struct edgeeg[40020];

int w[220][220],inout[220];

int gap[220],dis[220],pre[220];

queueq;

void bfs()

} //for(i=0;i<=n;i++) cout<0 && dis[i]+1==dis[u]) break;

if(i<=n)

else

} return ans;

}int main()

st=0; tr=n+1; n++;

rep(i,n-1)

if(inout[i]<0) w[i][tr]=-inout[i];

else w[st][i]=inout[i];

isap();

bool ff=true;

rep(i,n-1)

if(w[st][i]!=0)

if(!ff) printf("no\n");

else

}return 0;

}

第三章 從迴圈到網路

include include stdlib.h define n 64 define tpb 32 每個執行緒塊包含32個執行緒 device float scale int i,int n device float distance float x1,float x2 global void d...

讀《網路是怎樣連線的》第三章

依舊看看這部分主線是什麼 資料從網絡卡中出來,跑到了網線上 到了集線器 到了交換機 到了路由器,然後繼續到網線,如此反覆的 最終找到目的地.雖然現在我們的路由器功能很強大,繼承了交換機等功能,但是我們學習的話,還是把每一步拆開來看 比較好.這部分講了什麼內容呢?說了資料傳輸過程會受到干擾和失真,從而...

讀《網路是怎樣連線的》第三章

依舊看看這部分主線是什麼 資料從網絡卡中出來,跑到了網線上 到了集線器 到了交換機 到了路由器,然後繼續到網線,如此反覆的 最終找到目的地.雖然現在我們的路由器功能很強大,繼承了交換機等功能,但是我們學習的話,還是把每一步拆開來看 比較好.資料到了網線 資料到了集線器 資料到了交換機 資料到了路由器...