[网络流24题-2]cogs396魔术球问题
扫描二维码
随时随地手机看文章
至于那个贪心的证明我是没整出来的。。。看了黑书,可能是我没有认真看吧。
最小路径点覆盖:用最少的边去覆盖尽可能多的点(全部)。
黑书上介绍了一个求最小路径点覆盖的方法,很值得借鉴,那就是每个点
为什么呢?因为假定原图每条边只对应一个点,那么
具体到这个题,就是把两个和为完全平方数的两球连一条边,枚举,数据比较小,能过。而且我并不觉得设一个上界和下界去二分能提升多大的速度,所以直接用
唯一注意的是,上一次枚举完的边还可以用的 要加的边只是所有点到多的点还要加的边。然后这样的话跑cogs的数据足够。。。。
然后还是要用匈牙利算法求最大匹配;judge函数用来判断是否和为平方数。
代码
#include
#include
#include
#include
#include
#include
#include
#include
//AC
using namespace std;
const int maxn=10000;
vector g[maxn];
void addedge(int from,int to)
{
g[from].push_back(to);
g[to].push_back(from);
}
int match[maxn];
bool book[maxn];
int n;
bool judge(int n)
{
double nn=sqrt(n);
if((int)n/nn==nn)
{
return true;
}
return false;
}
bool dfs(int v)
{
for(unsigned i=0;i