可行流無非就是把給定的一些條件轉化為最大流可以完成的任務,著名的題目有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...
讀《網路是怎樣連線的》第三章
依舊看看這部分主線是什麼 資料從網絡卡中出來,跑到了網線上 到了集線器 到了交換機 到了路由器,然後繼續到網線,如此反覆的 最終找到目的地.雖然現在我們的路由器功能很強大,繼承了交換機等功能,但是我們學習的話,還是把每一步拆開來看 比較好.這部分講了什麼內容呢?說了資料傳輸過程會受到干擾和失真,從而...
讀《網路是怎樣連線的》第三章
依舊看看這部分主線是什麼 資料從網絡卡中出來,跑到了網線上 到了集線器 到了交換機 到了路由器,然後繼續到網線,如此反覆的 最終找到目的地.雖然現在我們的路由器功能很強大,繼承了交換機等功能,但是我們學習的話,還是把每一步拆開來看 比較好.資料到了網線 資料到了集線器 資料到了交換機 資料到了路由器...