(JZ4252)2019.01.30【NOIP提高组】模拟B组 0.QYQ的图

2024-01-30 05:48

本文主要是介绍(JZ4252)2019.01.30【NOIP提高组】模拟B组 0.QYQ的图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【五校联考7day2】QYQ的图

Description

给你一个n个点,m条边的无向图,每个点有一个非负的权值ci,现在你需要选择一些点,使得每一个点都满足:
如果这个点没有被选择,则与它有边相连的所有点都必须被选择。
问:满足上述条件的点集中,所有选择的点的权值和最小是多少?
QYQ很快就解决了这个问题,但是他已经回到了左下角……没有留下答案,现在只好请你来解决这个问题啦!

Input

从文件graph.in中输入数据。
输入的第一行包含两个整数n,m
输入的第二行包含n个整数,其中第i个整数代表ci
输入的第三行到第m+2行,每行包含两个整数u,v,代表点u和点v之间有一条边

Output

输出到文件graph.out中。
输出的第一行包含一个整数,代表最小的权值和

Sample Input
3 1
1 2 3
3 1

Sample Output
1
样例说明:
只选择1号点,满足题意

Data Constraint

对于20% 的数据:n<=10
对于40%的数据:n<=20
对于100%的数据:1<=n<=50, 1<=m<=500, 0<=c<=1000
图中可能会有重边,自环。
点的编号为1—n。

纪中题解:

直接搜索就好了,当然不要 O(2^n)那种,每次搜索的时候如果这个点不选,就直接把与它相连的所有点选上,搜索的时候加入一些剪枝,比如如果现在的结果已经比现在的最佳答案大了就直接不搜了

悲催的故事:

   原本是想直接打个暴搜,dfs选的点。那么就反推题目(如果这个点没有被选择,则与它有边相连的所有点都必须被选择):如果这个点被选择,则与它有边相连的所有点都不被选择。因为这样代价最小。
   过了水样例,但后来发现,如下图:肯定要选权值为二的那个点,但如果按之前的方法来算,那么3–10就会选10,3–5就选不了了
画得丑不要介意
   然后就想着dfs不选的数。每不选一个数,就将与它有边相连的点加上。我们设k数组来装可以dfs的点,不可以的点包括:之前dfs过的点,加上的点。然后再dfs。
   不过不知道是回溯出了问题还是怎么的,只有20分╮(╯▽╰)╭(不过你也没有判断自环和重边啊!(○・`Д´・ ○))

20%:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,ans=233333,minn;
int c[55];
bool p[55][55],d[55][55],k[55];void dfs(int x){
bool e[55][55];k[x]=0;if (minn>=ans) return;memcpy(e,p,sizeof(p));for (int i=1; i<=n; i++) if (p[x][i]){minn+=c[i];k[i]=0; p[x][i]=0; p[i][x]=0;for (int j=1; j<=n; j++) {p[i][j]=0; p[j][i]=0;}}for (int i=1; i<=n; i++) if (k[i]) dfs(i); memcpy(p,e,sizeof(e));k[x]=1;
}
int main(){freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1; i<=n; i++) scanf("%d",&c[i]);for (int i=1; i<=m; i++){int u,v;scanf("%d%d",&u,&v);p[u][v]=1; p[v][u]=1;}memcpy(d,p,sizeof(d));for (int i=1; i<=n; i++) {minn=0;memcpy(p,d,sizeof(p)); memset(k,1,sizeof(k));dfs(i);ans=min(ans,minn);}printf("%d",ans);return 0;fclose(stdin); fclose(stdout);
}

   
   
   

100%

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{int to,next;
}a[1100];
int n,m,tot,ans,minn;
int b[55],c[55],ls[55],jh[55];
bool k[55],bj[55];void add(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}void dfs(int x){b[++tot]=x; k[x]=1;for (int i=ls[x]; i; i=a[i].next)if (!k[a[i].to]) dfs(a[i].to);
}
void QYQ(int dep,int z){if(z>=minn) return;//剪枝if(dep>tot){minn=min(minn,z);return;}QYQ(dep+1,z+c[b[dep]]);if(!jh[b[dep]]&&!bj[b[dep]]){for(int i=ls[b[dep]]; i; i=a[i].next) jh[a[i].to]++;QYQ(dep+1,z);for(int i=ls[b[dep]]; i; i=a[i].next) jh[a[i].to]--;}
}
int main(){freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1; i<=n; i++) scanf("%d",&c[i]);for (int i=1; i<=m; i++){int u,v;scanf("%d%d",&u,&v);add(u,v); add(v,u);if (u==v) bj[u]=1;}for (int i=1; i<=n; i++) {minn=233333333; tot=0;if (k[i]) continue;dfs(i);QYQ(1,0);ans+=minn;}printf("%d",ans);return 0;fclose(stdin); fclose(stdout);
}

这篇关于(JZ4252)2019.01.30【NOIP提高组】模拟B组 0.QYQ的图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659268

相关文章

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<