题意:

给出n个点,m条边,将若干个点染色,使得每个边至少有一点染色,问至少染多少个点。

思路:

如果是二分图,那就是最小点覆盖,但是这是一般图。

一般图的最小覆盖是npc问题,但是这题有一个条件比较特殊,就是输入的每条边都保证了至少有一个点小于等于30,所以至多覆盖30个点就可以了。

那么就可以用搜索解决,对于一个点,要么覆盖,要么不覆盖。

如果这个点被覆盖了,就直接往下搜;

如果没有被覆盖,那么就要么覆盖这个点,直接往下搜;要么不覆盖这个点,但把这个点相邻的点全部覆盖,再往下搜。

得剪枝,可行性剪枝和最优性剪枝。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <vector>
 5 using namespace std;
 6 const int N = 505;
 7 int vis[N];
 8 vector<int> g[N];
 9 int tot;
10 int ans;
11 void dfs(int cu,int sum)
12 {
13     if (sum > ans) return;
14     if (cu > tot)
15     {
16         ans = sum;
17         return;
18     }
19     if (vis[cu]) dfs(cu+1,sum);
20     else
21     {
22         vis[cu]++;
23         dfs(cu+1,sum+1);
24         vis[cu]--;
25         for (auto x : g[cu])
26         {
27             if (!vis[x]) sum++;
28             vis[x]++;
29         }
30         dfs(cu+1,sum);
31         for (auto x : g[cu])
32         {
33             vis[x]--;
34             if (!vis[x]) sum--;
35         }
36     }
37 }
38 int main()
39 {
40     int n,m;
41     while (scanf("%d%d",&n,&m) != EOF)
42     {
43         tot = 0;
44         ans = 10000;
45         memset(vis,0,sizeof(vis));
46         for (int i = 1;i <= n;i++) g[i].clear();
47         for (int i = 0;i < m;i++)
48         {
49             int x,y;
50             scanf("%d%d",&x,&y);
51             g[x].push_back(y);
52             g[y].push_back(x);
53         }
54         tot = min(30,n);
55         ans = tot;
56         dfs(1,0);
57         printf("%d\n",ans);
58     }
59     return 0;
60 }

转载于:https://www.cnblogs.com/kickit/p/8997016.html

scu 4439 Vertex Cover相关推荐

  1. SCU 4439 Vertex Cover(二分图最小覆盖点)题解

    题意:每一条边至少有一个端点要涂颜色,问最少涂几个点 思路:最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联,显然是道裸最小顶点覆盖题: 参考:二分图 代码: #include<iost ...

  2. 集合覆盖 顶点覆盖: set cover和vertex cover

    这里将讲解一下npc问题中set cover和vertex cover分别是什么. set cover: 问题定义: 实例:现在有一个集合A,其中包含了m个元素(注意,集合是无序的,并且包含的元素也是 ...

  3. 1134. Vertex Cover (25)

    1134. Vertex Cover (25) 时间限制 600 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A vertex ...

  4. PAT甲级1134 Vertex Cover :[C++题解]顶点覆盖、图论、用结构体存边,bool数组判断

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:首先把所有的边存储下来,使用结构体,结构体中保存两个端点. 然后对于每次询问,将出现过的顶点标志为true放在st数组中,然后遍历所有 ...

  5. 二分图匹配 + 最小点覆盖 - Vertex Cover

    Vertex Cover Problem's Link Mean: 给你一个无向图,让你给图中的结点染色,使得:每条边的两个顶点至少有一个顶点被染色.求最少的染色顶点数. analyse: 裸的最小点 ...

  6. 从顶点覆盖(Vertex Cover)到碰撞集(Hitting Set)的归约

    碰撞集问题 给定一组集合{S1,S2,S3,-,Sn}和预算b,问是否存在一个集合H,其大小不超过b,且H和所有Si(i=1, 2, -, n)相交. 顶点覆盖问题 给定图G,问是否存在一个顶点集合V ...

  7. Vertex Cover问题

    最近算法课上完成了一道作业题,Vertex Cover,拿出来与大家分享一下.算法不能说有多好,有问题欢迎致信ms08.shiroh@gmail.com 1,问题描述 首先Vertex Cover问题 ...

  8. Vertex Cover SCU - 4439

    点击打开链接 虽然不是二分图 但如果把每条边都建成双向边 再对每一个点都匹配一次 就相当于把这个图从某个位置划分成了男女生两个部分 用男生对女生匹配一次 反过来女生又对男生匹配一次 具体是怎么划分的不 ...

  9. 【题解】Luogu SP1435 PT07X - Vertex Cover

    原题传送门 求树的最小点覆盖,就是一个树形dp 类似于没有上司的舞会 dp的状态为\(f[i][0/1]\),表示i节点是否选择 边界是\(f[x][0]=0\),\(f[x][1]=1\) 转移方程 ...

最新文章

  1. Web Service 安全性解决方案(SOAP篇)
  2. kernel笔记——内核编译与进程管理
  3. terminate和quit导致串口资源被占用
  4. 小米一键上锁工具_小米智能门锁和猫眼,可女声变男声与访客隔门沟通
  5. [转载]细说ASP.NET Windows身份认证
  6. Visual Studio 2010 Ultimate开发与测试敏捷特性
  7. java封装概念_Java面向对象----封装概念
  8. 数据流重导向 -- 第11章   认识与学习 BASH
  9. 如何实现一个简单的熔断以及Hystrix原理分析
  10. java contains_生成不重复随机数 java
  11. jQuery应用实例4:下拉列表
  12. 微软工程师主讲的SqlServer2005视频教程
  13. 计算机无法卸载软件,电脑安装的软件无法卸载怎么办?
  14. python远程执行linux命令unzip_Linux unzip命令
  15. c语言中关系运算符和逻辑运算符,c语言中的关系运算符和逻辑运算符
  16. 伽卡他卡学生端卸载方案
  17. 记一次线上微信公众号迁移遇到的坑
  18. 在服务器上创建文件夹,在服务器上创建文件夹
  19. 设计必备,5个免费图标资源网站
  20. 什么是HashMap?不同版本的HashMap有什么不同?浅谈HashMap

热门文章

  1. LabVIEW的万金油框架
  2. [体检]悲从中来,伤不起
  3. java反射和反编译
  4. mysql启动失败原因排查
  5. MFC应用程序单文档及类向导的使用
  6. BSV 上的点对点结算衍生品:远期合约
  7. python 常用转义字符对照表 键盘各键对应的ASCII码值
  8. Teen Readers【青少年读者】
  9. 20、Docker基础知识-Image Index 和 manifest
  10. 元素的alt和title有什么异同?