BZOJ3438 洛谷P1361 小M的作物

2022-05-19 09:45:10 字數 1159 閱讀 3773

題目大意:

有a、b兩個集合和n個物品,每個物品只能放在乙個集合裡。每個物品放在不同集合內能獲得不同價值。

有一些物品,如果它們同時放在乙個集合內,則會產生新的價值(a和b中都有且不一定相同(c1和c2))。有若干這樣的關係。

現在讓你求最大總價值。

解題思路:

最大權閉合子圖。

首先拆點,把點i拆成xi和yi

從s向每個xi連容量為「其放在集合a中的價值」的邊,從xi向yi連容量為inf的邊,從yi向t連容量為「其放在集合b中的價值」的邊。

對於每個關係,新建節點p1,p2。從s向p1連容量為c1的邊,從p1向每個有關係的y點連容量為inf的邊;從p2向t連容量為c2的邊,從每個有關係的x點向p2連容量為inf的邊。

然後用總價值(包括關係中的c1和c2)減去最小割即可。

c++ code:

#include#include#include#includeconst int s=0,t=40003,inf=0x3fffffff;

inline int readint()

int n,m,head[40333],cnt=1,level[40333],iter[40333],mrsrz,nx[40333];

struct edgee[1700005];

inline void addedge(int u,int v,int t);

head[u]=cnt;

e[++cnt]=(edge);

head[v]=cnt;

}std::queueq;

void bfs() }}

inline int min(int a,int b)else level[e[i].to]=-1;

} return 0;

}int dinic()

}int main()

for(int i=1;i<=n;++i)addedge(i,i+n,inf);

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

mrsrz=n<<1;

for(int k=readint();k--;)

printf("%d\n",ans-dinic());

return 0;

}

洛谷 P1361 小貓爬山

p1361 小貓爬山 wd和lhx飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了。wd和lhx只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租...

洛谷 P1361 小貓爬山

wd和lhx飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了。wd和lhx只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,wd和lh...

洛谷 P1361 小M的作物

有 nn n 種作物,兩塊耕地 a aa 和 bbb 第 i ii 種作物種植在 a aa 中收益為 a ia i ai 種植在 b bb 中收益為 b ib i bi 另有 m mm 種組合,每種組合有 k kk 種作物,如果這 k kk 種作物共同種在 a aa 中收益為 c1i c1 i c1...