這道題真的折磨了我好久。。
開始不會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...