时间限制: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的更多相关文章

  1. 分珠(dfs+并查集)

    1140 分珠 时间限制:500MS  内存限制:65536K提交次数:24 通过次数:18 题型: 编程题   语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不 ...

  2. 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 W​i​​ assigne ...

  3. 邮局 100分代码(dfs+多重剪枝)

    蓝桥杯真题-邮局 #include<iostream> #include<algorithm> #include<set> #include<string&g ...

  4. 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 ...

  5. 【PAT甲级】1094 The Largest Generation (25 分)(DFS)

    题意: 输入两个正整数N和M(N<100,M<N),表示结点数量和有孩子结点的结点数量,输出拥有结点最多的层的结点数量和层号(根节点为01,层数为1,层号向下递增). AAAAAccept ...

  6. 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)

    题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ...

  7. 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 ...

  8. 天梯赛练习 L3-011 直捣黄龙 (30分) dijkstra + dfs

    题目分析: 本题我有两种思路,一种是只依靠dijkstra算法,在dijkstra部分直接判断所有的情况,以局部最优解得到全局最优解,另一种是dijkstra + dfs,先计算出最短距离以及每个点的 ...

  9. ACM/ICPC 之 分治法入门(画图模拟:POJ 2083)

    题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X  X   X    X  X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规 ...

随机推荐

  1. CodeSign error: code signing is required for product type Application in SDK iOS

    在真机测试的时候往往会突然出现这样一个错误,code signing is required for product type 'Application' in SDK 'iOS 7.0'  ,就是说 ...

  2. php curl get post

    post有3种. 1.post方式 privatefunction send_post($url,$post_data){ $ch = curl_init($url); curl_setopt($ch ...

  3. 解决xib约束冲突

    I would recommend to debug and find which constraint is "the one you don't want". Suppose ...

  4. ui组件--弹出层layer的使用

    帮助文档 下载地址 演示地址

  5. 当一个页面出现多个checkbox全选时的处理

    HTML: <input type="checkbox" onclick="boxOnclick(this,'some1')">全选一 <in ...

  6. 求sqrt()底层效率问题(二分/牛顿迭代)

    偶然看见一段求根的神代码,于是就有了这篇博客: 对于求根问题,通常我们可以调用sqrt库函数,不过知其然需知其所以然,我们看一下求根的方法: 比较简单方法就是二分咯: 代码: #include< ...

  7. codevs 1080 线段树练习

    链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...

  8. orcad candence 快捷键小结

  9. Clr Via C#读书笔记---计算限制的异步操作

    线程池基础 1,线程的创建和销毁是一个昂贵的操作,线程调度以及上下文切换耗费时间和内存资源. 2,线程池是一个线程集合,供应你的用程序使用. 3,每个CLR有一个自己的线程池,线程池由CLR控制的所有 ...

  10. MVC公开课 – 2.查询,删除 (2013-3-15广州传智MVC公开课)

    查询 /Controller/HomeController.cs /// <summary> /// 查询 文章 列表 /// </summary> /// <retur ...