題目大意:
有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...