hdu 2489 Minimal Ratio Tree

https://vjudge.net/problem/HDU-2489

题意:求一个完全图的最优比率生成树,点的个数由题给出。最优比率生成树是边的权值之和与点的权值之和的比值最小的生成树。

思路:一开始用dfs枚举搜索每一种情况,t了,枚举的情况太多。之后看了题解,用的是状态压缩的方法枚举点的选择,这样的情况要少得多。至于其他的细节倒是很好想,由于比值最小,所以我们要求的是一棵最小生成树,再比上点的权值之和,最后选择出最小的就行了。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <map>
  4 #include <algorithm>
  5 using namespace std;
  6 
  7 int n,m;
  8 
  9 int par[20];
 10 int a[20][20];
 11 int b[20];
 12 
 13 struct node
 14 {
 15     int x,y,d;
 16 } g[1000];
 17 
 18 void init(int k)
 19 {
 20     for (int i = 0;i <= k;i++)
 21         par[i] = i;
 22 }
 23 
 24 int fin(int x)
 25 {
 26     if (x == par[x]) return x;
 27     else return par[x] = fin(par[x]);
 28 }
 29 
 30 void unit(int x,int y)
 31 {
 32     x = fin(x);
 33     y = fin(y);
 34 
 35     if (x != y) par[x] = y;
 36 }
 37 
 38 bool cmp(node aa,node bb)
 39 {
 40     return aa.d < bb.d;
 41 }
 42 
 43 double solve(int k)
 44 {
 45     init(n);
 46 
 47     int p[20],cnt = 0;
 48     int num = 0;
 49 
 50     for (int i = 0;i < n;i++)
 51     {
 52         if (k & (1 << i)) p[cnt++] = i;
 53     }
 54 
 55     for (int i = 0;i < cnt;i++)
 56     {
 57         for (int j = i + 1;j < cnt;j++)
 58         {
 59             g[num].x = p[i];
 60             g[num].y = p[j];
 61             g[num].d = a[p[i]][p[j]];
 62             num++;
 63         }
 64     }
 65 
 66     int sum = 0,sm = 0;
 67 
 68     for (int i = 0;i < cnt;i++)
 69     {
 70         int t = p[i];
 71         sum += b[t];
 72     }
 73 
 74     sort(g,g+num,cmp);
 75 
 76     for (int i = 0;i < num;i++)
 77     {
 78         int x = g[i].x,y = g[i].y;
 79 
 80         //printf("%d %d88\n",x,y);
 81 
 82         if (fin(x) == fin(y)) continue;
 83 
 84         unit(x,y);
 85 
 86         sm += g[i].d;
 87     }
 88 
 89     return 1.0 * sm / sum;
 90 }
 91 
 92 int main()
 93 {
 94     while (scanf("%d%d",&n,&m) != EOF)
 95     {
 96         double minn = 10000000000;
 97 
 98         if (!m && !n) break;
 99 
100 
101         for (int i = 0;i < n;i++)
102             scanf("%d",&b[i]);
103 
104         for (int i = 0;i < n;i++)
105             for (int j = 0;j < n;j++)
106             scanf("%d",&a[i][j]);
107 
108         int ba = (1 << n) - 1;
109 
110         for (int i = 3;i <= ba;i++)
111         {
112             int num = 0;
113 
114             for (int j = 0;j < n;j++)
115             {
116                 if (i & (1 << j)) num++;
117             }
118 
119             if (num == m)
120             {
121                 //0printf("00\n");
122                 double tmp = solve(i);
123 
124                 if (tmp < minn)
125                 {
126                     minn = tmp;
127                 }
128             }
129         }
130 
131         int mark;
132 
133         for (int i = 3;i <= ba;i++)
134         {
135             int num = 0;
136 
137             for (int j = 0;j < n;j++)
138             {
139                 if (i & (1 << j)) num++;
140             }
141 
142             if (num == m)
143             {
144                 double tmp = solve(i);
145 
146                 if (tmp == minn)
147                 {
148                     mark = i;
149                     break;
150                 }
151             }
152         }
153 
154         int p[20];
155 
156         int cnt = 0;
157 
158         for (int i = 0;i < n;i++)
159         {
160             if (mark & (1 << i)) p[cnt++] = i;
161         }
162 
163         for (int i = 0;i < cnt;i++)
164         {
165             if (!i) printf("%d",p[i]+1);
166             else printf(" %d",p[i]+1);
167         }
168 
169         printf("\n");
170     }
171 
172     return 0;
173 }

 

再附上一份t了的代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <algorithm>
  4 #include <map>
  5 #include <vector>
  6 using namespace std;
  7 
  8 int n,m;
  9 int num = 0;
 10 int par[20];
 11 int a[20];
 12 int b[20][20];
 13 bool v[20];
 14 int s[20];
 15 vector<int> vv[10005];
 16 map<double,int> mmp;
 17 
 18 double minn;
 19 
 20 struct node
 21 {
 22     int x,y,d;
 23 } g[500];
 24 
 25 bool cmp(node aa,node bb)
 26 {
 27     return aa.d < bb.d;
 28 }
 29 
 30 void init(int k)
 31 {
 32     for (int i = 0;i <= k;i++)
 33         par[i] = i;
 34 }
 35 
 36 int fin(int x)
 37 {
 38     if (x == par[x]) return x;
 39     else return par[x] = fin(par[x]);
 40 }
 41 
 42 void unit(int x,int y)
 43 {
 44     x = fin(x);
 45     y = fin(y);
 46 
 47     if (x != y) par[x] = y;
 48 }
 49 
 50 void solve(void)
 51 {
 52     int cnt = 0;
 53 
 54     bool f = 0;
 55 
 56     init(n);
 57 
 58     for (int i = 0;i < m;i++)
 59         for (int j = i + 1;j < m;j++)
 60     {
 61         int x = s[i],y = s[j];
 62         if (b[x][y])
 63         {
 64             g[cnt].x = x;
 65             g[cnt].y = y;
 66             g[cnt].d = b[x][y];
 67             cnt++;
 68         }
 69     }
 70 
 71     int sum = 0;
 72 
 73     for (int i = 0;i < m;i++)
 74     {
 75         int t = s[i];
 76 
 77         sum += a[t];
 78     }
 79 
 80     sort(g,g+cnt,cmp);
 81 
 82     int sm = 0;
 83 
 84     for (int i = 0;i < cnt;i++)
 85     {
 86         int x = g[i].x,y = g[i].y;
 87 
 88         if (fin(x) == fin(y)) continue;
 89 
 90         sm += g[i].d;
 91 
 92         unit(x,y);
 93     }
 94 
 95     int rt = fin(s[0]);
 96 
 97     for (int i = 0;i < m;i++)
 98     {
 99         if (fin(s[i]) != fin(rt)) f = 1;
100     }
101 
102     double now = 1.0 * sm / sum;
103 
104     if (!f && now < minn)
105     {
106         if (!mmp[now])
107         {
108             mmp[now] = num;
109             minn = now;
110 
111             for (int i = 0;i < m;i++)
112                 vv[num].push_back(s[i]);
113 
114             num++;
115         }
116 
117     }
118 }
119 
120 void dfs(int i,int p)
121 {
122     if (m == n && p == m - 1)
123     {
124         s[p] = i;
125         solve();
126         return;
127     }
128     else if (m < n && p == m)
129     {
130         solve();
131         return;
132     }
133 
134     s[p] = i;
135 
136     for (int j = 0;j < n;j++)
137     {
138         if (!v[j])
139         {
140             v[j] = 1;
141             dfs(j,p+1);
142             v[j] = 0;
143         }
144     }
145 }
146 
147 
148 int main()
149 {
150     while (scanf("%d%d",&n,&m) != EOF)
151     {
152         if (m == 0 && n == 0) break;
153 
154         num = 0;
155 
156         minn = 1000000000;
157 
158         memset(v,0,sizeof(v));
159         memset(s,0,sizeof(s));
160         memset(a,0,sizeof(a));
161         memset(b,0,sizeof(b));
162         memset(g,0,sizeof(g));
163         memset(vv,0,sizeof(vv));
164 
165         for (int i = 0;i < n;i++)
166             scanf("%d",&a[i]);
167 
168 
169         for (int i = 0;i < n;i++)
170             for (int j = 0;j < n;j++)
171             scanf("%d",&b[i][j]);
172 
173         for (int i = 0;i < n;i++)
174         {
175             v[i] = 1;
176             dfs(i,0);
177             v[i] = 0;
178         }
179 
180         int k = mmp[minn];
181 
182         sort(vv[k].begin(),vv[k].end());
183 
184         for (int i = 0;i < vv[k].size();i++)
185         {
186             if (!i) printf("%d",vv[k][i] + 1);
187             else printf(" %d",vv[k][i] + 1);
188         }
189 
190         printf("\n");
191     }
192 
193     return 0;
194 }

 

转载于:https://www.cnblogs.com/kickit/p/7150817.html

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

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

相关文章

SQL多表关联

多表关联&#xff1a; 多张数据表之间是可以有一定的关联关系&#xff0c;这种关联关系可以通过外键约束实现 多表的分类&#xff1a; 一对一一对多多对多 一对一&#xff1a; 一张表对应一张表 适用场景举例&#xff1a; 人和身份证。一个人只能有一个身份证&#xff0c;一个身…

背包问题 codevs2210 数字组合

数字组合 题目描述 Description在N个数中找出其和为M的若干个数。先读入正整数N和M&#xff0c; 再读入N个正数&#xff08;可以有相同的数字&#xff0c;每个数字均在1000以内&#xff09;&#xff0c; 在这N个数中找出若干个数&#xff0c; 使它们的和是M&#xff0c; 把满足…

SQL多表查询

多表查询分类&#xff1a; 内连接查询 显式内连接隐式内连接 外连接查询 左外连接右外连接 子查询自关联查询 准备数据&#xff1a; -- 创建user表 CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT, -- 用户idNAME VARCHAR(20), -- 用户姓名age INT …

HTTP协议整理

一、概念 1.HTTP协议&#xff1a;即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和Web服务器之间互相通信的规则&#xff0c;它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。它可以使浏览器更加高效&#xff0c;使网络传输减少。…

【DDD】--好文收藏

索引&#xff1a; 目录索引 发现一批好文&#xff0c;完整系列&#xff0c;攒~~ 随笔分类 - DDD - 『圣杰』 DDD理论学习系列&#xff08;1&#xff09;-- 通用语言 笔记&#xff1a; 通用语言&#xff1a; a) 简单&#xff0c;便于理解、传播。 b) 需要通用&#xff0c;能够准…

SQL存储过程、存储函数

概念&#xff1a; 存储过程和函数&#xff1a; 存储过程和函数是事先经过编译并存储在数据库中的一SQL语句的集合 存储过程和函数的好处&#xff1a; 存储过程和函数可以重复使用&#xff0c;减轻开发人员的工作量。类似于java中方法可以多次调用减少网络流量&#xff0c;存储…

meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1 /

X-UA-Compatible是针对IE8新加的一个设置&#xff0c;对于IE8之外的浏览器是不识别的&#xff0c;这个区别与content"IE7"在无论页面是否包含<!DOCTYPE>指令&#xff0c;都像是使用了 Windows Internet Explorer 7的标准模式。而content"IEEmulateIE7&quo…

错误页跳转

错误页跳转的语法 <%page errorPage"出现错误跳转页面"%> <%page isErrorPage"true/false%>跳转到此页面进行处理错误 代码如下&#xff1a; <%page language"java" contentType"text/html" pageEncoding"GBK"%&g…

yum 安装mysql数据库

1、先查看是否有安装mysql&#xff0c;有的话通过yum remove mysql先卸载掉&#xff0c;卸载完成后执行 yum install -y mysql-server mysql mysql-deve 2、启动mysql服务 service mysqld start  //也可以通过/etc/init.d/mysqld start启动 3、设置为开机自启动 chkconfig m…

修改项目名称之后,访问不到项目的问题

转载于:https://www.cnblogs.com/Joke-Jay/p/7190187.html

Mysql锁机制详解

Mysql锁&#xff1a; 在多线程当中如果想保证数据的准确性是如何实现的呢&#xff1f;没错&#xff0c;通过同步实现。同步就相当于是加锁。加了锁以后有什么好处呢&#xff1f;当一个线程真正在操作数据的时候&#xff0c;其他线程只能等待。当一个线程执行完毕后&#xff0c;…

stanford-parser for C#

在项目里用到C#对英文句子进行词性标注。比較成熟的英文词性标注软件是stanford-parser。它个C#版本号&#xff0c;也是借助于IKVM完毕JAVA-C#的转换。详细配置过程例如以下&#xff1a; 1、下载stanford-parser的jar包 http://nlp.stanford.edu/software/lex-parser.shtml 2…

保姆级Mycat操作详解

Mycat环境搭建&#xff1a; 下载&#xff1a;http://dl.mycat.org.cn/2.0/ 上传到虚拟机并解压 tar -zxvf mycat.tar.gz cd mycat ll授权&#xff1a;设置mycat权限 chmod -R 777 mycat环境变量&#xff1a;配置环境变量 # 编辑文件 vi /etc/profile # 添加内容&#xff…

百度陆奇最新内部演讲:如何成为一个优秀的工程师?

作者&#xff5c;陆奇 来源&#xff5c;百度 Family 一位工程师&#xff0c;如何才能称得上优秀&#xff1f;除了写得一手好 Code&#xff0c;什么样的工作态度和方法才是一个优秀工程师的必备&#xff1f;7 月 11 日&#xff0c;陆奇出席百度内部 Engineering Leadership Talk…

最常见的水平拆分规则

1.枚举法&#xff1a; <tableRule name"sharding-by-intfile"><rule><columns>user_id</columns><algorithm>hash-int</algorithm></rule></tableRule> <function name"hash-int" class"io.myca…

TestNG-详解preserve-order的作用与测试case的执行顺序

在TestNG xml配置文件中&#xff0c;关于<test>的配置里面&#xff0c;有一个属性叫preserve-order&#xff0c;一开始以为这个属性可以用来控制测试case(那些被Test注解标注的方法)的执行顺序&#xff0c;后来测试了一把&#xff0c;发现没有这种效果&#xff0c;最后上…

数据库连接JDBC

JDBC&#xff1a; JDBC&#xff08;Java DataBase Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一访问&#xff0c;它是由一组用Java语言编写的类和接口组成的。其实就是java官方提供的一套规范(接口)。用…

【bzoj】 1412: [ZJOI2009]狼和羊的故事

Description “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&#xff1a;狼和羊如此和谐&am…

计算机基础--网络

互联网协议 互联网协议的功能&#xff1a;定义计算机如何接入internet&#xff0c;以及接入internet的计算机通信的标准。 互联网协议按照功能不同分为osi七层或者tcp/ip五层或tcp/ip四层 每层常见物理设备 因为学习python编程只需要了解tcp/ip五层模型&#xff0c;所以我们只需…

万字详解数据库连接池

数据库连接池的概念 数据库连接是一种关键的、有限的、昂贵的资源&#xff0c;这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性&#xff0c;影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连…