# 思路
首先想到費用流。
對於每個點拆點。然後考慮我們怎樣才能保證每個點只被用一次。
如果$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...