bzoj4514 數字配對

2022-04-10 05:20:39 字數 1117 閱讀 7420

# 思路

首先想到費用流。

對於每個點拆點。然後考慮我們怎樣才能保證每個點只被用一次。

如果$i$與$j$滿足條件。那麼就從$i$向$j$連一條邊並且從$j$向$i$連一條邊。這樣每次增廣的時候我們都可以看作某一條邊被增廣了兩次。顯然從$i$到$j$和從$j$到$i$的邊是等價的。也就是說,如果當前增廣這兩個點之間的邊更優秀,那麼在增廣完成從$i$到$j$和從$j$到$i$這兩條邊流量變為$0$之前不回去增廣其他的邊。

比較難解釋,仔細想一下可以發現是對的。這樣最後我們找出的流量實際上是答案的兩倍。除二即可。

然後還要考慮題目中對於價值的限制。我們把價值當作費用,每次增廣費用最大的路徑。直到如果再增廣費用變為負數為止。

# **

```cpp=

/** @author: wxyww

* @date: 2019-02-17 14:52:25

* @last modified time: 2019-02-17 19:36:45

*/#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n = 410,m = 1000000 + 100,inf = 1e9;

ll read()

while(c>='0'&&c<='9')

return x*f;

}struct node e[m];

int head[n],ejs = 1;

void add(int u,int v,int w,ll c)

int a[n],vis[n],fa[n],b[n];

ll dis[n],c[n];

queueq;

int s,t;

bool pd(int x,int y)

bool spfa()

} }return fa[t];

}ll dinic()

cost += dis[t] * mn;

flow += mn;

} return flow;

}int main()

```

bzoj4514 Sdoi2016 數字配對

有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足,ai 是 aj 的倍數,且 ai aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的價值總和不小於 0 的前提下,求最多進行多少次配...

bzoj4514 Sdoi2016 數字配對

bzoj4514 sdoi2016 數字配對 題意 有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足ai 是 aj 的倍數且 ai aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的...

BZOJ 4514 Sdoi2016 數字配對

time limit 10 sec memory limit 128 mb submit 1606 solved 608 submit status discuss 有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足,ai 是 aj 的倍數,且 ai a...