題意描述:給你一張有向圖,每個點有兩個權值(w+,w-),w+表示刪掉該點的所有入邊所需要的花費,w-表示刪掉該點的所有出邊所需要的花費,問要刪除所有的點需要的最少花費為多少?
分析:因為涉及到了點權和所有的邊那麼很容易想到最小點權覆蓋,但是這裡每個點有兩個權值怎麼處理呢?這樣建圖: 將點拆成兩個點,每個點對應乙個權值,有聯絡的兩個點(u,v),u『到v』『連一條權值為無窮大的邊,v』『到匯點連一條權值為w+的邊,源點到u』連一條權值為w-的邊,這樣就將原圖轉換為二分圖,這樣求的最小個即為原問題的解!最後就是輸出問題(找到所有的割邊即可)
**如下:
#include#include#includeusing namespace std;
const int n = 1000;
const int e = 50000;
const int inf = 0xfffffff;
bool vis[n];
int e,head[n];
int dep[n],que[n],cur[n];
struct node
edge[e];
void addedge(int u,int v,int c)
int maxflow(int s,int t)
} if(dep[t]==-1)
break;
memcpy(cur,head,sizeof(head));
for(i=s,top=0;;)
for(k=0;kn ) count ++;
}else
}printf("%d\n",count);
for( i = 1; i <= 2 * n; i ++ )
else
}} return 0;
}
POJ 2125 最小點權覆蓋集(輸出方案)
題意 給乙個圖 有自迴路,重邊 要去掉所有邊,規則 對某個點,可以有2種操作 去掉進入該點 的所有邊,也可以去掉出該點所有邊,第一種代價為w 第二種代價為w 求最小代價去除所有邊。己思 點的權被分為出入?必然拆點啊!每個點一分為二,點權 出的為出點權,入的為入點權,原來邊仍在 注意,這裡 1 1 不...
POJ 2125 網路流拆點最小點權覆蓋
destroying the graph poj 2125 目前想法是拆點加最小點權覆蓋 這道題的特殊點在於他還要尋找最小點權覆蓋選擇的是 1 n取s能遍歷到的點,n 1 2 n取s遍歷不到的點 那個求割點的重點在於一定要用visit,別用vis,重名了 題意就是 有乙個圖,兩種操作,一種是刪除某點...
poj 3308 最小點權覆蓋 最小割
思路 裸的最小點權覆蓋,建立超級源點和超級匯點,將源點與行相連,容量為這行消滅敵人的代價,將列與匯點相連,容量為這列消滅敵人的代價,對於每乙個敵人 x,y 連邊x y,容量為inf,這樣就說明選取的點覆蓋了那些邊 敵人 然後跑最大流求最小割即可。ps 這裡是乘積最小,要取對數轉化為和最小。1 inc...