1140 分珠 dfs
时间限制:500MS 内存限制:65536K
提交次数:24 通过次数:18
题型: 编程题 语言: G++;GCC
Description
如下图所示,有若干珠子,每颗珠子重量不同,珠子之间有一些细线将它们连在一起。现要求切断一些细线,将它们分成两部分,分割后,单独每一部分的珠子仍保持相连,且要求尽量做到两部分总重相等或相差最少。
请编一程序,给定珠子个数、每颗珠子的重量以及珠子之间的连接情况,输出按上述要求分割后两部分总重的差值的绝对值。
输入格式
第一行有两个数N与M(1<=N,M<=10),N为珠子个数(珠子编号依次为1,2,3,...,N),M为连接珠子的细线数目。第二行为N个正整数,分别为N个珠子的重量。此后M行,每行两个数X与Y,表示珠子X与珠子Y由细线相连。
输出格式
按要求分割后两部分总重的差值的绝对值。
输入样例
5 5
1 2 3 4 1
1 2
1 3
2 3
3 4
4 5
输出样例
1
题意:给出一个图,将图分成两半,每一部分都需要保持连通,问分开能得到的最小差值
思路:n最大只有10,可以枚举n的所有组合作为其中一半,然后判断这一半所有节点是否连通,然后再判断剩下的所有节点是否连通,从所有组合中得到最小差值
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std ;
int a[], G[][], vis[] ;
int n, m, sx ;
vector<int> vc;//vc里面存储当前枚举到的节点,并判断连通性
void dfs(int cur)//dfs标记
{
vis[cur] = ;
for(int i = ; i <= n; ++i)
if(!vis[i] && G[cur][i]) dfs(i) ;
}
int _union()//判断连通性
{
int leap = ;
for(int i = ; i < sx; ++i){
leap = ;
for(int j = ; j < sx; ++j) if(i != j){
if(G[ vc[i] ][ vc[j] ]){
leap = ;
break ;
}
}
if(!leap) break ;
}
if(!leap) return ;
else return ;
}
int check()
{
sx = vc.size() ;
if(vc.size() > ) if(!_union()) return ;
for(int k = ; k <= n; ++k) if(!vis[k]){
dfs(k) ;
break ;
}
for(int i = ; i <= n; ++i)
if(!vis[i]) return ;
return ;
}
int main()
{
int u, v, sum = , mi = << , flag ;
memset(G, , sizeof G) ;
scanf("%d%d",&n,&m) ;
for(int i = ; i <= n; ++i){
scanf("%d",&a[i]) ;
sum += a[i] ;
}
flag = sum >> ;//以sum的一半作为flag
for(int i = ; i <= m ; ++i){
scanf("%d%d",&u,&v) ;
G[u][v] = ;
G[v][u] = ;
}
for(int i = ; i < ( << n); ++i)//枚举所有的组合
{
int now = ;
vc.clear() ;
memset(vis, , sizeof vis) ;
for(int j = ; j <= n; ++j)
if(i & ( << (j - ))){
vis[j] = ;
now += a[j] ;
vc.push_back(j) ;
}
if(now < flag || now >= mi) continue ;
if(check()) mi = now ;
}
printf("%d\n",abs(sum - * mi)) ;
}
修改一下,当vc.size() == 2 时, 也要判断这两个节点的连通性
1140 分珠 dfs的更多相关文章
- 分珠(dfs+并查集)
1140 分珠 时间限制:500MS 内存限制:65536K提交次数:24 通过次数:18 题型: 编程题 语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不 ...
- PAT 甲级 1053 Path of Equal Weight (30 分)(dfs,vector内元素排序,有一小坑点)
1053 Path of Equal Weight (30 分) Given a non-empty tree with root R, and with weight Wi assigne ...
- 邮局 100分代码(dfs+多重剪枝)
蓝桥杯真题-邮局 #include<iostream> #include<algorithm> #include<set> #include<string&g ...
- PAT A1103 Integer Factorization (30 分)——dfs,递归
The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...
- 【PAT甲级】1094 The Largest Generation (25 分)(DFS)
题意: 输入两个正整数N和M(N<100,M<N),表示结点数量和有孩子结点的结点数量,输出拥有结点最多的层的结点数量和层号(根节点为01,层数为1,层号向下递增). AAAAAccept ...
- 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)
题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ...
- 1034 Head of a Gang (30分)(dfs 利用map)
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...
- 天梯赛练习 L3-011 直捣黄龙 (30分) dijkstra + dfs
题目分析: 本题我有两种思路,一种是只依靠dijkstra算法,在dijkstra部分直接判断所有的情况,以局部最优解得到全局最优解,另一种是dijkstra + dfs,先计算出最短距离以及每个点的 ...
- ACM/ICPC 之 分治法入门(画图模拟:POJ 2083)
题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X X X X X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规 ...
随机推荐
- myEclipse中改了项目名,出现的问题 和 错误java.io.IOException: tmpFile.renameTo(classFile) failed
今天遇到一个很头疼的问题,建的一个新项目,后来因为一些原因把项目名改了,之后就做了一些业务,但运行时总是没有反应,后来在myEclipse工作空间下的webapps文件中发现, 部署的文件名和项目名称 ...
- Web上的支持的图片格式以及它们之间的区别
一.GIF(图形交换格式) GIF格式的图片最多只能保存256中颜色,该格式支持透明色,支持动画效果. 二.JPEG(联合图像专家组) JPEG格式不支持透明色及动画,颜色可达1670种. 三.PNG ...
- in addition to 和 except for
except for 除了...以外(与 except for 连用的整体词与 except for 所跟的词往往不是同类的,是指整体中除去 一个细节.) eg:Your composition is ...
- 数据存储--sqlite总结
SQLite SQLite(轻量级的数据库,关系型数据库) 辅助工具:Navicat Premium 等 原理:ios针对存储问题封装了sqlite数据库(c语言数据库). 1 app获取沙盒地址命名 ...
- openURL的使用方法:
openURL的使用方法: view plaincopy toclipboardprint? [[UIApplication sharedApplication] openURL:[NS ...
- NYOJ题目1162数字
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAr8AAAJ/CAIAAAD+kywNAAAgAElEQVR4nO3dO1LjzN4H4G8T5CyE2A ...
- sqlite建表语句(特别是外键问题)
原创 sqlite建表语句(特别是外键问题) 下面图表示两个表关系: //表1User_invitecreate table User_invite(Invite_id INTEGER PRIMAR ...
- Git撤销提交和修改相关操作
团队开发中经常遇到错误删除文件,错误提交等情况,那么使用Git该如何正确的进行撤销和恢复呢? 一.增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言, ...
- Delphi中的变量作用域简介
1.在函数或过程中声明的变量是局部变量,只能在函数或过程中使用 2.在单元的implementation部分声明的变量是单元级的(又称模块级.窗体级)变量,该单元的所有函数与过程都能使用,其他引用该单 ...
- 【JAVA正则表达式综合练习】
一.治疗口吃. 将字符串“我我我我我我我..........我.......要要要要要..................要要要要...学习习习习.......习习习习习习习习编程程程程程程..... ...