时间限制:500MS  内存限制:65536K
提交次数:24 通过次数:18

题型: 编程题   语言: G++;GCC

Description

  1. 如下图所示,有若干珠子,每颗珠子重量不同,珠子之间有一些细线将它们连在一起。现要求切断一些细线,将它们分成两部分,分割后,单独每一部分的珠子仍保持相连,且要求尽量做到两部分总重相等或相差最少。
  2. 请编一程序,给定珠子个数、每颗珠子的重量以及珠子之间的连接情况,输出按上述要求分割后两部分总重的差值的绝对值。

输入格式

  1. 第一行有两个数NM1<=N,M<=10),N为珠子个数(珠子编号依次为123,...,N),M为连接珠子的细线数目。第二行为N个正整数,分别为N个珠子的重量。此后M行,每行两个数XY,表示珠子X与珠子Y由细线相连。

输出格式

  1. 按要求分割后两部分总重的差值的绝对值。

输入样例

  1. 5 5
  2. 1 2 3 4 1
  3. 1 2
  4. 1 3
  5. 2 3
  6. 3 4
  7. 4 5

输出样例

  1. 1

题意:给出一个图,将图分成两半,每一部分都需要保持连通,问分开能得到的最小差值

思路:n最大只有10,可以枚举n的所有组合作为其中一半,然后判断这一半所有节点是否连通,然后再判断剩下的所有节点是否连通,从所有组合中得到最小差值

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <vector>
  8. using namespace std ;
  9. int a[], G[][], vis[] ;
  10. int n, m, sx ;
  11. vector<int> vc;//vc里面存储当前枚举到的节点,并判断连通性
  12. void dfs(int cur)//dfs标记
  13. {
  14. vis[cur] = ;
  15. for(int i = ; i <= n; ++i)
  16. if(!vis[i] && G[cur][i]) dfs(i) ;
  17. }
  18. int _union()//判断连通性
  19. {
  20. int leap = ;
  21. for(int i = ; i < sx; ++i){
  22. leap = ;
  23. for(int j = ; j < sx; ++j) if(i != j){
  24. if(G[ vc[i] ][ vc[j] ]){
  25. leap = ;
  26. break ;
  27. }
  28. }
  29. if(!leap) break ;
  30. }
  31. if(!leap) return ;
  32. else return ;
  33. }
  34. int check()
  35. {
  36. sx = vc.size() ;
  37. if(vc.size() > ) if(!_union()) return ;
  38. for(int k = ; k <= n; ++k) if(!vis[k]){
  39. dfs(k) ;
  40. break ;
  41. }
  42. for(int i = ; i <= n; ++i)
  43. if(!vis[i]) return ;
  44. return ;
  45. }
  46. int main()
  47. {
  48. int u, v, sum = , mi = << , flag ;
  49. memset(G, , sizeof G) ;
  50. scanf("%d%d",&n,&m) ;
  51. for(int i = ; i <= n; ++i){
  52. scanf("%d",&a[i]) ;
  53. sum += a[i] ;
  54. }
  55. flag = sum >> ;//以sum的一半作为flag
  56. for(int i = ; i <= m ; ++i){
  57. scanf("%d%d",&u,&v) ;
  58. G[u][v] = ;
  59. G[v][u] = ;
  60. }
  61. for(int i = ; i < ( << n); ++i)//枚举所有的组合
  62. {
  63. int now = ;
  64. vc.clear() ;
  65. memset(vis, , sizeof vis) ;
  66. for(int j = ; j <= n; ++j)
  67. if(i & ( << (j - ))){
  68. vis[j] = ;
  69. now += a[j] ;
  70. vc.push_back(j) ;
  71. }
  72. if(now < flag || now >= mi) continue ;
  73. if(check()) mi = now ;
  74. }
  75. printf("%d\n",abs(sum - * mi)) ;
  76. }

修改一下,当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. iOS-WKWebView携带cookie发送http请求,cookie失效

    发送请求代码: NSString *testUrl = @"http://10.22.122.7:8081/test2_action/view_index"; NSURL *url ...

  2. 会话控制(session、cookie)

    1.session(1)session存储在服务器的(2)session每个人存一份(3)session有默认的过期时间(4)session里面可以存储任意类型的数据安全,对服务造成压力用法:1.当一 ...

  3. 关于Cookie和Session的优缺点

    关于Cookie和Session的优缺点 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. Cookie的优缺点:优点:极高的扩展性和可用 ...

  4. spring集成activeMQ

    1.安装activehttp://activemq.apache.org/activemq-5140-release.html2.运行D:\apache-activemq-5.14.0\bin\win ...

  5. notifyDataSetInvalidated和notifyDataSetChanged有什么区别

    notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容.public void notifyDataSetChang ...

  6. 聊聊Android的APK反编译

    上一篇<How To Use Proguard in Android APP>介绍了如何对Android进行混淆,现在来对它进行反编译看看,里面有些什么东西. APK文件,其实也是一个压缩 ...

  7. 通过mysql命令行理解mysql

    引言:工具不可谓给我们的生活带来了便利,但有些时候我们却忘记了事物本身的意义.在大多数人都在追捧甚至是盲从各种各样的工具有多先进的时候,你是否有反思过:你目前是否有使用它的资格. 假设你学会了使用一款 ...

  8. mysqli的增强功能

    批量执行sql语句 批量执行dml语句 基本语法 $sqls="sql1.sql2.sql3...." mysqli::multi_query($sqls) 案例: $mysqli ...

  9. selenium--python如何定位一组元素并返回文本值

    from selenium import webdriverimport time a=[] #创建一个空列表用于存储查询到的元素组driver = webdriver.Firefox()driver ...

  10. 【数据库】 Sqlserver 2008 error 40出现连接错误的解决方法

    经常要连接到远程数据库上,因此常常碰到这个错误,然后又屡次忘记解决方法,所以今天坐下笔迹,好下次能快速回忆起来. 一.首先检查数据库的TCP/TP是否启动 1.启动Sql server配置管理器 2. ...