POJ 2531(搜索剪枝)
来源:互联网 发布:opencv2.4.4 sift算法 编辑:程序博客网 时间:2024/06/05 05:17
题目链接poj2531
题目大意
一个有n个节点的图(
n≤20 ),节点间距C给定,让你把这个图分为A、B两类节点使得∑Cij,(i∈A,j∈B) 最大,问这个最大值是多少。
分析
由于n很小只有20,可以直接枚举,复杂度是
采用深度优先搜索的方法,对每一个节点都做判断是否应该移到另一组去,判断的依据是移过去和不移过去哪个得到的和值比较大。如果移过去后值变小了则不移过去并且剪掉这条支路。
这个剪枝策略的正确性证明还没想出来,以后再补。
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<stack>using namespace std;int n;int C[25][25];int A[25];int Ans;void Print(){ for(int i=1;i<=n;i++) { cout<<A[i]; } cout<<endl;}void dfs(int x,int ans)//ans是不加x时的答案{ if(x==n+1) { //Print(); Ans=max(Ans,ans); return ; } int ans2=ans; dfs(x+1,ans); A[x]=1; for(int i=1;i<x;i++) if(A[i]==1)ans2-=C[x][i]; for(int i=1;i<=n;i++) if(A[i]==0)ans2+=C[x][i]; if(ans2>=ans){dfs(x+1,ans2);} A[x]=0;}int main(){ while(scanf("%d",&n)!=EOF) { Ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&C[i][j]); memset(A,0,sizeof(A)); dfs(1,0); cout<<Ans<<endl; }}
0 0
- POJ 2531(搜索剪枝)
- poj 1011 搜索(剪枝)
- POJ 2531Network Saboteur(dfs+搜索剪枝)
- POJ 1011 Sticks(搜索剪枝)
- POJ 2362 Square (搜索 + 剪枝)
- POJ 2676Sudoku(Dfs+搜索剪枝)
- POJ 2790 Consecutive ones (搜索 + 剪枝)
- poj 1011 Sticks 深度搜索+(剪枝)
- POJ - 1011 搜索剪枝
- poj 1411(搜索+剪枝)
- poj 3411 搜索+剪枝
- poj 1191 搜索+剪枝
- poj 1190 搜索+剪枝
- POJ 1011 搜索剪枝
- poj 2078(搜索+剪枝)
- poj 1948(搜索+剪枝)
- poj 生日蛋糕 搜索+剪枝
- POJ 1724 ROADS (搜索+剪枝)
- 第十四周项目一数组大折腾(2)创建一个长度为10的整形数组并初始化,由后往前(由第9个元素向第0个元素方向)输出数组中所有元素的值,改变数组元素的值,令所有的数组加倍,输出改变后的值。
- linux下安装jdk的步骤和方法
- Android复习之旅--ViewPager(自动轮播条)
- Swift3 基础语法
- Python 基础 二
- POJ 2531(搜索剪枝)
- git命令 branch 切换远程分支Github
- intellij IDEA 启动tomcat时显示端口被占用
- servlet3.0 getPart()与getParts()获取上传文件
- Redis 主从复制
- CSS 设置字体大小用法介绍
- Java常考编程题(基础)--不断更新
- Web项目中使用Spring 3.x + Quartz 2.x实现作业调度详解
- 让eclipse变得快点,取消validation