思路:裸的最小點權覆蓋,建立超級源點和超級匯點,將源點與行相連,容量為這行消滅敵人的代價,將列與匯點相連,容量為這列消滅敵人的代價,對於每乙個敵人(x,y),連邊x->y,容量為inf,這樣就說明選取的點覆蓋了那些邊(敵人),然後跑最大流求最小割即可。
ps:這裡是乘積最小,要取對數轉化為和最小。
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
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 }
poj 3308(最小割求解最小點權覆蓋)
火星人侵略地球,他們意圖登陸破壞某個地區的兵器工廠。據探子回報,火星人登陸的地區為n m大小的地域,而且每乙個火星人的著陸點座標已知。火星人很強悍,只要有乙個火星人著陸後能夠倖存,他必定能毀壞這片區域的全部兵工廠。為了防止這種情況發生,必須保證在火星人著陸的一瞬間把他們全部同時殺死。現在防衛隊有乙個...
poj 2125 最小點權覆蓋
題意描述 給你一張有向圖,每個點有兩個權值 w w w 表示刪掉該點的所有入邊所需要的花費,w 表示刪掉該點的所有出邊所需要的花費,問要刪除所有的點需要的最少花費為多少?分析 因為涉及到了點權和所有的邊那麼很容易想到最小點權覆蓋,但是這裡每個點有兩個權值怎麼處理呢?這樣建圖 將點拆成兩個點,每個點對...
網路流(最小割最大流) POJ3308
poj3308 題意 簡單的說就是有乙個方陣,告訴你方陣裡的一些位置有一些敵人傘兵,而且你有一些雷射槍,這些雷射槍有穿透效果,也就是如果擺在第一排的排頭話就可以殺死這一排的所有傘兵,當然也可以放在一列的列頭可以殺死一列的傘兵。在不同行或列建立雷射槍所需的費用不一樣,建立這些雷射槍的總費用是建立每個雷...