poj 3308 最小點權覆蓋 最小割

2021-09-06 11:43:16 字數 1361 閱讀 7460

思路:裸的最小點權覆蓋,建立超級源點和超級匯點,將源點與行相連,容量為這行消滅敵人的代價,將列與匯點相連,容量為這列消滅敵人的代價,對於每乙個敵人(x,y),連邊x->y,容量為inf,這樣就說明選取的點覆蓋了那些邊(敵人),然後跑最大流求最小割即可。

ps:這裡是乘積最小,要取對數轉化為和最小。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8#define maxn 222

9#define maxm 444444

10#define inf 1<<30

1112

struct

edgeedge[maxm];

1617

intn,m,t,ne,nv,vs,vt;

18int

head[maxn];

1920

void insert(int u,int v,double

cap)

2132

33int

level[maxn],gap[maxn];

34void bfs(int

vt)3552}

53}54}

5556

intpre[maxn],cur[maxn];

57double sap(int vs,int

vt)58

80 aug=inf;81}

82break;83

}84}85

if(flag)continue;86

int minlevel=nv;

87for(int i=head[u];i!=-1;i=edge[i].next)93}

94if(--gap[level[u]]==0)break

;95 level[u]=minlevel+1

;96 gap[level[u]]++;

97 u=pre[u];98}

99return

maxflow;

100}

101102

intmain()

103116

for(int i=1;i<=m;i++)

120while(t--)

124double ans=sap(vs,vt);

125 printf("

%.4f\n

",exp(ans));

126}

127return0;

128 }

view code

poj 3308(最小割求解最小點權覆蓋)

火星人侵略地球,他們意圖登陸破壞某個地區的兵器工廠。據探子回報,火星人登陸的地區為n m大小的地域,而且每乙個火星人的著陸點座標已知。火星人很強悍,只要有乙個火星人著陸後能夠倖存,他必定能毀壞這片區域的全部兵工廠。為了防止這種情況發生,必須保證在火星人著陸的一瞬間把他們全部同時殺死。現在防衛隊有乙個...

poj 2125 最小點權覆蓋

題意描述 給你一張有向圖,每個點有兩個權值 w w w 表示刪掉該點的所有入邊所需要的花費,w 表示刪掉該點的所有出邊所需要的花費,問要刪除所有的點需要的最少花費為多少?分析 因為涉及到了點權和所有的邊那麼很容易想到最小點權覆蓋,但是這裡每個點有兩個權值怎麼處理呢?這樣建圖 將點拆成兩個點,每個點對...

網路流(最小割最大流) POJ3308

poj3308 題意 簡單的說就是有乙個方陣,告訴你方陣裡的一些位置有一些敵人傘兵,而且你有一些雷射槍,這些雷射槍有穿透效果,也就是如果擺在第一排的排頭話就可以殺死這一排的所有傘兵,當然也可以放在一列的列頭可以殺死一列的傘兵。在不同行或列建立雷射槍所需的費用不一樣,建立這些雷射槍的總費用是建立每個雷...