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) 分治法:不断缩小规 ...
随机推荐
- 【python】入门学习(四)
函数: 定义函数 #area.py from math import pi def area(radius): """Return the area of a circl ...
- 【hihoCoder】第20周 线段树
题目: 输入 每个测试点(输入文件)有且仅有一组测试数据. 每组测试数据的第1行为一个整数N,意义如前文所述. 每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品 ...
- 让view 覆盖导航栏
当我们想做一个弹出式菜单时,想将导航栏也一起盖住不显示的话,可以用如下语句实现: UIView* myView = /* 你自定义的view */; UIWindow* currentWindow = ...
- 让ar执行queryall和queryrow方法返回数组
让ar执行queryall和queryrow方法返回数组 <?phpnamespace common\components;use \CActiveRecord;use \Yii;use \CD ...
- asp.net Excel数据导入到数据库中
protected void Btn_Import_Click(object sender, EventArgs e) { bool Result_Import = false; bool Resul ...
- September 25th 2016 Week 40th Sunday
Everything is good in its season. 万物逢时皆美好. Don't lose hope. Remeber that even a dog has its day. Onc ...
- 使用vsphere client 克隆虚拟机
免费的VMWare ESXi5.0非常强大,于是在vSphere5.0平台中ESXi取代了ESX.,使用ESXi经常会遇到这样的问题,我需要建立多个虚拟机,都是windows2003操作系统,难道必须 ...
- springmvc上传List,
@RequestMapping("pay") public ModelAndView pay(String orderNo, TransactionDTO transaction, ...
- jq点击和鼠标移上效果以及一个等号"=" 二个等号"==" 三个等号"===" 的区别
<body> <div class="a" bs='1' style="width:100px; height:30px; border:1px sol ...
- Java并发编程实现概览
并发概览 >>同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通 ...