博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1636 DFS+DP
阅读量:6093 次
发布时间:2019-06-20

本文共 1247 字,大约阅读时间需要 4 分钟。

思路:

先搜索出来如果选这个点 其它哪些点必须选
跑个背包就好了

//By SiriusRen#include 
#include
#include
using namespace std;#define N 66666int xx,yy,v[N],next[N],first[1004],tot,top,vis[1004],cases,m,r,f[1005][1005];struct Stk{int x,y;}s[N];void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}void dfs(int x){ if(x<=m)s[top].x++; else s[top].y++; for(int i=first[x];~i;i=next[i]) if(!vis[v[i]]) vis[v[i]]=1,dfs(v[i]);}int main(){ scanf("%d",&cases); while(cases--){
memset(f,0,sizeof(f)); memset(vis,0,sizeof(vis)); memset(first,-1,sizeof(first)); tot=top=0; scanf("%d%d",&m,&r); while(r--)scanf("%d%d",&xx,&yy),add(xx,yy+m),add(yy+m,xx); for(int i=1;i<=m*2;i++) if(!vis[i]) vis[i]=1,top++,s[top].x=s[top].y=0,dfs(i); f[0][0]=1; for(int i=1;i<=top;i++) for(int j=m;j>=s[i].x;j--) for(int k=m;k>=s[i].y;k--) f[j][k]=f[j][k]|f[j-s[i].x][k-s[i].y]; for(int i=m/2;i>=0;i--) if(f[i][i]){
printf("%d\n",i); break; } }}

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532174.html

你可能感兴趣的文章
while()
查看>>
常用限制input的方法
查看>>
Ext Js简单事件处理和对象作用域
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
12.通过微信小程序端访问企查查(采集工商信息)
查看>>
WinXp 开机登录密码
查看>>
POJ 1001 Exponentiation
查看>>
HDU 4377 Sub Sequence[串构造]
查看>>
云时代架构阅读笔记之四
查看>>
WEB请求处理一:浏览器请求发起处理
查看>>
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>
LeetCode 404 Sum of Left Leaves
查看>>
LeetCode 83 Remove Duplicates from Sorted List
查看>>
醋泡大蒜有什么功效
查看>>
hdu 5115(2014北京—dp)
查看>>
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)...
查看>>
PHP读取日志里数据方法理解
查看>>
EF 中 自定义的参数查询
查看>>
开源软件与免费软件的区别
查看>>