[SCU4439] Vertex Cover [2015 Sichuan Province Contest Final D]
来源:互联网 发布:淘宝皇冠转让 编辑:程序博客网 时间:2024/06/04 19:00
题意
给出300个点,求最小点覆盖,对每一条边存在限制:至少一个端点是前30个点。
题解
对前30个点的状态进行搜索,加上可行性剪枝和最优性剪枝。
当前状态要求得已用点个数和还需要多少点才能得到一个覆盖,这两个点数的和大于已有答案则不继续搜索,这是最优性剪枝。
如果一个点周围的点有没有被选的,那么这个点必选,不去搜索这个点不选的状态,这是可行性剪枝。
另外,用结构体写的边表T了。。被水淹没、不知所措。。
代码
/****************************************\* Author : ztx* Title : D - Vertex Cover* ALG : 连二分图匹配都不用,直接搜索+剪枝* CMT :* Time :\****************************************/#include <cstdio>#define Rep(i,l,r) for(i=(l);i<=(r);i++)#define rep(i,l,r) for(i=(l);i< (r);i++)#define Rev(i,r,l) for(i=(r);i>=(l);i--)#define rev(i,r,l) for(i=(r);i> (l);i--)typedef long long ll ;typedef double lf ;int CH , NEG ;template <typename TP>inline void read(TP& ret) { ret = NEG = 0 ; while (CH=getchar() , CH<'!') ; if (CH == '-') NEG = true , CH = getchar() ; while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ; if (NEG) ret = -ret ;}template <typename TP>inline void readc(TP& ret) { while (ret=getchar() , ret<'!') ; while (CH=getchar() , CH>'!') ;}template <typename TP>inline void reads(TP *ret) { ret[0]=0;while (CH=getchar() , CH<'!') ; while (ret[++ret[0]]=CH,CH=getchar(),CH>'!') ; ret[ret[0]+1]=0;}#include <cstring>#include <vector>#define maxn 510LL#define maxm 124760LL/*struct FST { int to, next ; } e[maxm<<1] ;int star[maxn] , tote ;inline void AddEdge(int u,int v) { e[++tote].to=v;e[tote].next=star[u];star[u]=tote; e[++tote].to=u;e[tote].next=star[v];star[v]=tote;}*/std::vector<int> e[maxn] ;int n , m , ans , tot ;int needed[maxn] ;int p , v ;void dfs(int now,int used) { if (used > ans) return ; if (now > tot) { ans = used ; return ; } if (needed[now]) dfs(now+1,used) ; else { needed[now] ++ ; dfs(now+1,used+1) ; needed[now] -- ; rep (p,0,e[now].size()) { v = e[now][p] ; if (!needed[v]) used ++ ; needed[v] ++ ; } dfs(now+1,used) ; rep (p,0,e[now].size()) { v = e[now][p] ; needed[v] -- ; if (!needed[v]) used -- ; }/* for (int p=star[now],v=e[p].to;p;p=e[p].next) { if (!needed[v]) used ++ ; needed[v] ++ ; } dfs(now+1,used) ; for (int p=star[now],v=e[p].to;p;p=e[p].next) { needed[v] -- ; if (!needed[v]) used -- ; }*/ }}int main() {int i , u , v ;// #define READ #ifdef READ freopen(".in" ,"r",stdin ) ; freopen(".out","w",stdout) ; #endif while (scanf("%d%d", &n, &m) != EOF) { Rep (i,1,n) needed[i] = 0 ,//star[i] e[i].clear() ; //tote = 1 ; ans = m , tot = n ; if (n < ans) ans = n ; if (tot > 30) tot = 30 ; Rep (i,1,m) { read(u), read(v) ;// AddEdge(u, v) ; e[u].push_back(v) ; e[v].push_back(u) ; } dfs(1,0) ; printf("%d\n", ans) ; } #ifdef READ fclose(stdin) ; fclose(stdout) ; #else getchar() ; getchar() ; #endif return 0 ;}
0 0
- [SCU4439] Vertex Cover [2015 Sichuan Province Contest Final D]
- [SCU4436] Easy Math [2015 Sichuan Province Contest Final A]
- [SCU4437] Carries [2015 Sichuan Province Contest Final B]
- [SCU4438] Censor [2015 Sichuan Province Contest Final C]
- [SCU4440] Rectangle[2015 Sichuan Province Contest Final E]
- [SCU4441] Necklace [2015 Sichuan Province Contest Final F]
- [SCU4442] Party [2015 Sichuan Province Contest Final G]
- [SCU4443] Range Query [2015 Sichuan Province Contest Final H]
- [SCU4444] Travel [2015 Sichuan Province Contest Final I]
- [SCU4445] Right turn [2015 Sichuan Province Contest Final J]
- SCU4439-Vertex Cover
- 2015 Sichuan Province Contest (Carries)
- scu4439 Vertex Cover(二分图最小点覆盖 匈牙利)
- SCU 4439 Vertex Cover (2015四川省省赛D题)
- Vertex Cover
- Vertex Cover
- Vertex Cover
- Sichuan University Programming Contest 2013 Final (singal)E题
- Android for work总结(下)
- 彻底解决安装Python扩展包时Unable to find vcvarsall.bat
- 树莓派 Learning 001 装机 ---之 1 安装NOOBS系统
- Linux is not Matrix——MyCat实现读写分离
- HDU 5752 Sqrt Bo
- [SCU4439] Vertex Cover [2015 Sichuan Province Contest Final D]
- 绘图基础二
- 常用 web service
- 服务化拆分
- linux 网络编程之服务器多线程限制
- hdu 2239 Selecting Courses(二分图最大匹配)
- ObjectAnimator之android:propertyName
- 基于UAAG2.0 Reference的移动无障碍案例(一)
- HDU 2199 Can you solve this equation?(二分)