题目链接:https://www.bnuoj.com/v3/problem_show.php?pid=51645
最多只允许选10个点,要覆盖所有边,问最少选几个点。
可以给每条边标号,每一次选点的时候选链接到的没有被删掉的边的数量最多的点,然后每次都拿走度最大的点所连的边。直到没有这种点为止。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #include <bits/stdc++.h> 4 using namespace std; 5 6 const int maxn = 2020; 7 int n, m; 8 int vis[maxn]; 9 vector<int> G[maxn]; 10 11 int main() { 12 // freopen("in", "r", stdin); 13 int T; 14 int u, v; 15 scanf("%d", &T); 16 while(T--) { 17 scanf("%d%d",&n,&m); 18 for(int i = 1; i <= n; i++) G[i].clear(); 19 for(int i = 0; i < m; i++) { 20 scanf("%d%d",&u,&v); 21 G[u].push_back(i); 22 G[v].push_back(i); 23 } 24 int ret = 0, pos; 25 bool flag = 0; 26 memset(vis, 0, sizeof(vis)); 27 for(int i = 0; i <= 10; i++) { 28 ret = 0; 29 for(int j = 1; j <= n; j++) { 30 int tmp = 0; 31 for(int k = 0; k < G[j].size(); k++) { 32 if(!vis[G[j][k]]) tmp++; 33 } 34 if(tmp > ret) { 35 ret = tmp; 36 pos = j; 37 } 38 } 39 if(ret == 0) { 40 printf("%d ", i); 41 flag = 1; 42 break; 43 } 44 for(int j = 0; j < G[pos].size(); j++) { 45 vis[G[pos][j]] = 1; 46 } 47 } 48 if(!flag) puts("GG"); 49 } 50 return 0; 51 }