简略题意:给出一段贪心选择最小顶点覆盖问题的代码,要去把他hack掉,并使得贪心的答案要是正确答案的至少3倍。
构造一个二分图,设左边有
n
个点,标号是1~n。对于每个i
个点,每个点都选择左边的i个点连 1 条边,最终使得左边每个点的度数都为log级别,然而此时贪心的做法会选择右边的
nlogn
个点作为答案点,而正确答案应该是左边的
n
<script type="math/tex" id="MathJax-Element-261">n</script>个点。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n = 15;
cout<<60<<" "<<189<<endl;
int ss = n+1;
for(int i = 1; i <= n; i++) {
int cnt = 0;
for(int j = 1; j <= n/i; j++) {
for(int k = 1; k <= i; k++)
printf("%d %d\n", ss, ++cnt);
ss++;
}
}
printf("%d\n", n);
for(int i = 1; i <= n; i++)
cout<<i<<'\n';
return 0;
}