poj3686 KM演算法 拆點

2021-08-06 07:10:09 字數 1495 閱讀 2501

這道題真的折磨了我好久。。

開始不會km演算法 為了這道題去做了一些km演算法的題 也算是能理解了

km演算法題:

題意:輸入n m 代表有n的訂單和m臺機器

接下來乙個n*m的矩陣z  z[i][j]代表訂單i在機器j上完成需要消耗的時間 而且一台機器一旦操作了乙個訂單 這個訂單就必須在這台機器上完成 而且只有完成了這個訂單這台機器才能去操作其它的訂單

假設某個機器處理了k個玩具,時間分別為a1,a2…..,ak

那麼該機器耗費的時間為a1+(a1+a2)+(a1+a2+a3).......(a1+a2+...ak)    即

a1*k + a2 * (k - 1) + a3 * (k - 2).... + ak ai

玩具在某個機器上倒數第

k個處理,所耗費全域性的時間為

ai*k

對每個機器,最多可以處理n個玩具,拆成n個點,1~n分別代表某個玩具在這個機器上倒數第幾個被加工的,對於每個玩具i,機器j中拆的每個點k,連線一條w[i][j]*k權值的邊

// 帶權二分圖最佳匹配

//可以用來求最小費用流 將費用取反 最終結果再取反即可求得

//注意事項:

//1,匹配兩邊節點不需要相等;

//2,求最小權的時候只需要將權值取負,在求最大權即可;//十分有效

//3,不存在的邊權初始化為負無窮大;

//輸出小數時 c++用lf% g++用f% 迷迷迷

#include#include#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

#define m 50*50+5

#define inf 0x3f3f3f3f

int nx,ny;

int link[m],lx[m],ly[m],slack[m]; //lx,ly為頂標,nx,ny分別為x點集y點集的個數

int visx[m],visy[m],w[m][m];

int dfs(int x)

}else if (slack[y] > t) //不在相等子圖中slack 取最小的

slack[y] = t;

}return 0;

}int km()

}int res = 0;

for (i = 1;i <= ny;i ++)

if (link[i] > -1)

res += w[link[i]][i];

return res;

}int main()}}

nx=n,ny=n*m;

int tt=-km();

printf("%.6f\n",1.0*tt/n);//之前在這裡寫的lf 用g++提交的 wa了 用c++交16ms過了

}return 0;

}

POJ 3498 拆點 最大流

大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...

POJ 3498 拆點 最大流

大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...

poj 3498 最大流 拆點

思路 首先設乙個超級源點,將源點與各地相連,邊容量為各點目前的企鵝數量,然後就是對每個冰塊i進行拆點了 i,i n 邊容量為能夠接受的受損程度,這樣就把點權問題轉化為邊權問題了,然後就是對於那些能夠相互跳躍的冰塊之間連邊 i n,j j n,i 邊容量為inf。最後就是列舉匯點看是否等於總數。1 i...