分珠(dfs+并查集)

1140 分珠

时间限制: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



 

题解

  dfs枚举出所有去掉某些边的情况。去掉边后,用并查集求出此时有多少个联通块。如果正好有两个联通块,则更新最小值

  补充:也可以dfs求联通块

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair <int,int> pii;
const int maxn=20;
pii P[maxn];
int n,m,cur,ans,val[maxn],flag[maxn],sum[maxn],M[maxn][maxn],f[maxn];
int find(int x)
{int r=x,i=x,t;while (r!=f[r]) r=f[r];while (i!=r)//路径压缩{t=f[i];f[i]=r;i=t;}return r;
}
void mix(int x,int y)
{int fx=find(x),fy=find(y);if (fx!=fy){f[fx]=fy;sum[fy]+=sum[fx];//将儿子的值加给祖先cur--;//有两个块合并,联通块数量减一}
}
void init()
{for (int i=1;i<=n;i++)sum[i]=val[i],f[i]=i;cur=n;//联通块数量,初始值为n
}
int getnum()
{init();for (int i=0;i<m;++i){if (flag[i])//该边没被取消mix(P[i].first,P[i].second);}if (cur==2){for (int i=2;i<=n;i++)if (find(i)!=find(1))//此时只有两个联通块,可以直接找出与1不是同一个祖先的return abs(sum[find(1)]-sum[find(i)]);}return -1;//联通块数量不为2
}
void dfs(int pos)
{if (pos==n+1)return ;flag[pos]=0;//取消该边int temp=getnum();if (temp==-1)//得不到结果dfs(pos+1);else ans=min(ans,temp);//得到了结果,就没必要再取消这条边的情况下继续递归下去了,直接更新flag[pos]=1;dfs(pos+1);//在不取消该边的情况下递归
}
int main()
{scanf("%d%d",&n,&m);ans=0;for (int i=1;i<=n;i++){scanf("%d",&val[i]);ans+=val[i];}int a,b;for (int i=0;i<m;i++){scanf("%d%d",&a,&b);P[i]=make_pair(a,b);flag[i]=1;}dfs(1);printf("%d\n",ans);return 0;
}

 

转载于:https://www.cnblogs.com/scaugsh/p/5689814.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些程序员爆笑段子,扎心了…

1、特殊“2020是属于程序员的一年。”“怎么说&#xff1f;”“2020-1024996。”2、真相“你们程序员是不是没见过下班时候的太阳&#xff1f;”“也不是啦&#xff0c;夏天的时候还是能看到的。”“哦哦&#xff0c;夏天黑得比较晚。”“不是&#xff0c;是天亮得比较早。”3、…

lambda中sorted排序

准备工作&#xff0c;新建一个User类 使用stream排序操作&#xff08;默认ASC排序) stream倒序排序操作 sorted(Comparator.reverseOrder()) 代码例子&#xff1a; /*** lambda* sorted排序*/Testpublic void test19() {List<Integer> list new ArrayList<>();…

python中的括号不是西文吗_二级Python---python语言的基本语法元素(Day1)

一、基本输入输出函数Python中有三个重要的基本输入、输出函数&#xff0c;用于输入、转换和输出&#xff0c;分别是input()、eval()、print()。1.print()作用&#xff1a;输出运算结果&#xff1b;根据输出内容的不同&#xff0c;有三种用法。①、仅用于输出字符串&#xff0c…

chart.js 饼图显示百分比_实战PyQt5: 135-数据可视化之QChart绘制饼图

饼图是数据可视图表的基本类型&#xff0c;在QChart中&#xff0c;QPieSeries, QPieSlice处理饼图的绘制。QPieSeriesQPieSeries类以饼图形式显示数据。饼图系列由定义为QPieSlice对象的切片组成。切片可以具有任何值&#xff0c;因为QPieSeries对象计算切片的百分比与系列中所…

lambda中使用filter过滤

单一条件过滤 /*** 测试filter*/Testpublic void testFilter() {List<User> user new ArrayList<>();user.add(new User(1L, 18, "小明"));user.add(new User(2L, 20, "小王"));user.add(new User(3L, 28, "小刚"));user.add(new U…

Silverlight 打印

摘自&#xff1a;http://www.cnblogs.com/jiajiayuan/archive/2012/04/13/2444246.html Silverlight中的打印只有一个类&#xff0c;那就是PrintDocment这个对象来实现。下面我用两种方法来实现Silverlight的打印&#xff1a;第一种&#xff1a; private void btnPrint_Click(o…

数据库系统的体系结构知识笔记

1、集中式数据库系统分时系统环境下的集中式数据库系统结构诞生于20世纪60年代中期。当时的硬件和操作系统决定了分时系统环境下的集中式数据库系统构成早期的数据库技术的首选结构。数据和数据管理都是集中的&#xff0c;数据库系统的所有系统&#xff0c;从形式的用户到DBMS核…

mysql2014授权设置_mysql权限管理(2014-09-15)

本文比较碎片化&#xff0c;不过以问答的形式比较容易理解。如何查看mysql的当前登录的用户&#xff1f;select user();mysql -hlocalhost -uroot 与root192.168.11.100 区别&#xff1f;mysql -hlocalhost -uroot只能在本地进行登录&#xff0c;而root192.168.11.100不能在本…

python网站后台_Python 网站后台扫描脚本

Python 网站后台扫描脚本1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/usr/bin/python #codingutf-8 import sys import urllib import time url "http://123.207.123.228/" txt open(r"C:\Users\ww\Desk…

数据库系统的三级模式结构知识笔记

1、数据抽象的三个层次数据库系统利用三个层次划分来抽象来对用户屏蔽系统的复杂性、简化用户与系统的交互。1.1 物理层物理层属于最低级层次的抽象&#xff0c;描述数据在存储器上如何进行存储的。物理层会详细描述复杂的底层结构。1.2 逻辑层逻辑层属于中间层&#xff0c;用来…

Arrays.sort()排序

/*** Arrays.sort()排序* 默认升序*/Testpublic void test(){Integer[] result {1,4,7,9};Arrays.sort(result);for (int i 0;i<result.length;i)System.out.println(i);}

import package的问题

在新建class的时候除了名字还可以选择包名&#xff1a; 新建2个包名&#xff0c;然后在不同的包里写2个同名的类&#xff0c; 程序中导入另外一个包 package com.hs;import com.hy.Father; 当直接使用Father的时候提示是引用的com.hy.Father public static void main(String[] …

mysql分区列要包含主键吗_MYSQL的分区字段,必须包含在主键字段内

在对表进行分区时&#xff0c;如果分区字段没有包含在主键字段内&#xff0c;如表A的主键为ID,分区字段为createtime &#xff0c;按时间范围分区&#xff0c;代码如下&#xff1a; www.2cto.comCREATE TABLE T1 (id int(8) NOT NULL AUTO_INCREMENT,createtime datetime NOT …

python爬虫怎么下载图片到手机_Python爬虫获取图片并下载保存至本地

1、抓取煎蛋网上的图片。 2、代码如下&#xff1a; import urllib.request import os #to open the url def url_open(url): requrllib.request.Request(url) req.add_header(User-Agent,Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0) responseu…

数据库技术基础:常见基本模型介绍笔记

1、层次模型层次模型采用树型结构表示数据与数据间的联系。层次模型中每个节点表示一个实体&#xff0c;实体之间的联系用节点之间的连线表示&#xff0c;并且除了根节点以外&#xff0c;其他节点有且仅有一个双亲节点。层次模型特点&#xff1a;记录之间的联系通过指针实现&am…

升序

/*** 升序*/Testpublic void test25() {List<Integer> array Stream.of(1, 8, 5, 3).collect(toList());// 升序排序array.sort(Integer::compareTo);System.out.println(array);}

核心动画与UIView的区别

核心动画与UIView的区别 1、核心动画只作用于layer&#xff0c;使用核心动画之前&#xff0c;必须有layer 2、核心动画只是假象&#xff0c;并没有移动实际位置 什么时候使用核心动画&#xff0c;什么时候使用UIView动画 1、当不需要与用户进行交互时&#xff0c;使用核心动画或…

python convert函数_Python内置函数

英文文档&#xff1a;hex(x)Convert an integer number to a lowercase hexadecimal string prefixed with “0x”, for exampleIf x is not a Python int object, it has to define an __index__() method that returns an integer.说明&#xff1a;1. 函数功能将10进制整数转…

数据库技术:数据存储和查询知识笔记

1、存储管理器存储管理器作用&#xff1a;负责数据库中数据的存查询和更新。存储管理器负责和文件系统交互&#xff0c;将不同的DML语句翻译成底层文件系统命令&#xff0c;通过这种方式原始数据就通过文件系统存储在磁盘上。存储管理器是存储底层数据和应用程序、以及向数据库…

mininet在哪编写python脚本_1 mininet 简介及同时支持python2和python3

Mininet 是由斯坦福大学研究开发的开源软件&#xff0c;是一个基于Linux Container虚拟化技术的轻量级网络模拟器。即可以在个人电脑上模拟出包括交换机、主机、和控制器等软件定义网络节点。 为openflow应用提供简单、免费的应用测试平台。 支持多用户独立的在同一张拓扑上进行…