一張圖中每條邊都有同一時間能承載的最大資料量,求最大網路流即求從起點到終點同一時間能運輸的最大資料量。
找到一條從起點到終點的路,那麼這條路上運輸的資料量為權值最小的邊的權值,然後再依次做下去,但這樣過早地阻塞了後面的流,會造成無法得到最優解。解決的方法是新增一條反向邊,如果邊
流過了k
,那麼反向邊
的權值即為
n-k;
這樣就形成了一張殘餘網路;
dinic
演算法:^_^
據說^_^
從終點到起點所經過的邊的數量越少,那麼效率就越高。所以說可以先做一遍
bfs,找出每乙個點的層數,然後在
dfs時就只做自己下一層的點;找出一條路上的最小值後更新每個點的正邊(減少)和反邊(增加);
dinic**:
#include #include #include using namespace std;
int flag[210],dis[210],n,m,num=2,fir[210],dl[500],head,tail;
struct pppe[500];
void ini()
void add(int a,int b,int c,int rc)
int bfs()
} }return dis[n]<0x3f3f3f3f;
}int min(int x,int y)
int dfs(int s,int f)
} } return 0;
}int max_ans(int s)
} return ans;
}int main()
printf("%d\n",max_ans(1));
}}
!!question!!:
求大神回答這兩種寫法有什麼不同,都可以ac,但在不同的題中效率不一樣:
1:
int dfs(int s,int f)
} } return 0;
}
2:int dfs(int s,int f)
} return p-f;
}
題目小結 網路流
東拼拼,西湊湊,不就又水出一篇部落格嗎?例 1.text 首先可以想到在 1,n 列舉匯點,檢驗最大流是否為企鵝總數。每個點初始的企鵝數可以由 s rightarrow i 的邊表示,那跳出的企鵝呢?因為跳到哪個冰塊是未知的,所以不妨將 i 拆成兩個點 在入點與出點之間連邊權為跳出企鵝數的邊。例 2...
2019正睿金華集訓 0801總結 網路流
今天終於講了久仰其大名的網路流。網路流是乙個有向圖.容量 每條邊都有乙個容量 水管的最大水流容量 源點 出發點 水廠 匯點 結束點 廢水站 流 乙個合法解稱作乙個流,也就是一條可以從源點到匯點的一條合法路徑。流量 每條邊各自被經過的次數稱作其流量,最終收集的總數為整個流的流量。三個性質 1.容量限制...
暑期ACM集訓 網路流
problem 網路流模板 include include include include include include include using namespace std define inf 10000000 const int maxn 1000 struct edge vector g...