【poj3308】
題意:簡單的說就是有乙個方陣,告訴你方陣裡的一些位置有一些敵人傘兵,而且你有一些雷射槍,這些雷射槍有穿透效果,也就是如果擺在第一排的排頭話就可以殺死這一排的所有傘兵,當然也可以放在一列的列頭可以殺死一列的傘兵。在不同行或列建立雷射槍所需的費用不一樣,建立這些雷射槍的總費用是建立每個雷射槍的乘積,求建立雷射槍殺死所有傘兵的總費用。輸入:第一行是測試資料t, 第二行是行數(r) 列數(c) 傘兵數(l),第三行是建立在i行的雷射槍花費的費用,第四行是建立在i列所花費的費用,接著有l行是傘兵的座標。
解題思路:該題依然是乙個最小割最大流問題,首先就是建圖,我們可以把傘兵視為邊,行和列視為頂點,再增加乙個源點和乙個匯點,源點連線每個行,每個列連線匯點,容量分別為在該行和該列建立雷射槍的費用,傘兵的座標視為邊,容量為無窮大!根據割的性質,源點和匯點必不連通,因此割邊必定存在s->r r->c c->t中,將r->c的容量設為無窮大,則不能被選中。這樣割邊就在s->r c->t的集合,也就選中了對應的行和列,此時求得的最小割既為答案! 但是改題求得是乘積而不是和,那麼問題來了,怎麼將乘積變為和計算,那麼下面直接附上**,看完**應該就明白了
#include#includeint main()
下面是ac**:(值得注意的是如果用c++交的話是下面的**, 如果用g++交的話就把最後printf裡的「lf」的l去掉);
#define max 110
#define inf 10000000
#include#include#include#includestruct node
map[max][max];
int pre[max]; //pre[i]為增廣路徑頂點i前乙個頂點的序號
int queue[max]; //陣列模擬佇列
int s, t; //源點,匯點;
bool bfs() //bfs求增廣路}}
return 0; //匯點不在層次網路中
}double maxflow() //求最大流
for( i = t; i != s; i = pre[i])
max_flow += min;
}return max_flow; //返回最大流
}int main()
for( i = 1; i <= m; i++)
for(i = 1; i <= l; i++)
printf("%.4lf\n", exp(maxflow())); //輸出時將對數值轉換為原值
}return 0;
}
網路流 最大流最小割
網路流黃頁 最大流是增廣思想的傑作,針對增光特點,採用dinic阻塞流分層 除錯編譯通過 這個沒什麼,肯定不會考裸,模板的構建是最重要的 並且還有最小割最大流定理 相等 利用拆點實現割集劃分即選與不選,放a或b1 include2 include3 include4 include5 include...
網路流最大流最小割演算法
最大流演算法 不得不說網路流演算法是很讓人無語的演算法,要想高效率竟然要非遞迴實現深搜,很無奈,到現在還是在低效率中掙扎!最大流演算法的證明就不說了,無非就是最大流最小割定理的推導,定理描述如下 對於任意給定的網路d v,a,c 從出發點vs到收點vt的最大流的流量必等於分割的最小截集的容量!至於截...
網路流 最小割最大流定理
有乙個與最大流關係密切的問題 最小割。就是把所有的頂點分成兩個集合s和t v s,其中源點s在集合s中,匯點t在集合t中。如果把 起點在s中,終點在t中 的邊都刪除,就無法從s到達t了。我們把這樣的集合劃分 s,t 成為s t割,它的容量定義為c s,t c u,v 其中u s,t t,即起點在s中...