{POJ}{3925}{Minimal Ratio Tree}{最小生成树}
题意:给定完全无向图,求其中m个子节点,要求Sum(edge)/Sum(node)最小。
思路:由于N很小,枚举所有可能的子节点可能情况,然后求MST,memset()在POJ G++里面需要cstring头文件。
- #include <iostream>
- #include <vector>
- #include <map>
- #include <cmath>
- #include <memory>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- using namespace std;
- const int MAXN = 100;
- const int INF = 1<<30;
- #define CLR(x,y) memset(x,y,sizeof(x))
- #define MIN(m,v) (m)<(v)?(m):(v)
- #define MAX(m,v) (m)>(v)?(m):(v)
- #define ABS(x) ((x)>0?(x):-(x))
- #define rep(i,x,y) for(i=x;i<y;++i)
- int n,m,k;
- double ans = 0;
- int select[MAXN];
- int g[MAXN][MAXN];
- int val[MAXN];
- int visit[MAXN];
- double dist[MAXN];
- int ind[MAXN];
- double Prim()
- {
- int i,j,tmp,mark_i;
- int mark_min;
- int sum_node = 0;
- int sum_edge = 0;
- for(i = 0; i < n; ++i)
- {
- dist[i] = INF;
- visit[i] = 0;
- }
- for(i = 0; i < n; ++i)
- if(select[i]>0)
- {
- dist[i] = 0;
- break;
- }
- int cnt = 0;
- for(i = 0; i < n; ++i,++cnt)
- {
- if(cnt>=m) break;
- mark_min = INF;
- for(j = 0; j < n; ++j)
- {
- if(select[j]>0 && !visit[j] && mark_min>dist[j])
- {
- mark_min = dist[j];
- mark_i = j;
- }
- }
- visit[mark_i] = 1;
- sum_edge += dist[mark_i];
- for( j = 0; j < n; ++j)
- {
- if(visit[j]==0 && select[j]>0 && dist[j] > g[mark_i][j])
- dist[j] = g[mark_i][j];
- }
- }
- for( i = 0; i < n; ++i)
- if(select[i] > 0 )
- sum_node += val[i];
- return double(sum_edge)/sum_node;
- }
- int DFS(int cur, int deep)
- {
- double res = INF;
- select[cur] = 1;
- if(deep < m)
- {
- for(int i = cur+1; i < n; ++i)
- {
- DFS(i,deep+1);
- }
- }
- if(deep == m)
- {
- res = Prim();
- if(res < ans)
- {
- ans = res;
- for(int i = 0; i < n; ++i)
- ind[i] = select[i];
- }
- }
- select[cur] = 0;
- return 0;
- }
- int Solve()
- {
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- if(n == 0 && m == 0) break;
- for(int i = 0 ; i < n; ++i)
- scanf("%d",&val[i]);
- for(int i = 0; i < n; ++i)
- for(int j = 0; j < n; ++j)
- {
- scanf("%d",&g[i][j]);
- }
- CLR(select,0);
- ans = INF;
- for(int i = 0 ; i < n; ++i)
- DFS(i,1);
- int tag = 0;
- for(int i = 0; i < n; ++i)
- if(ind[i] > 0)
- if(tag == 0)
- {
- printf("%d",i+1);
- tag = 1;
- }
- else
- printf(" %d",i+1);
- printf("\n");
- }
- return 0;
- }
- int main()
- {
- Solve();
- return 0;
- }
{POJ}{3925}{Minimal Ratio Tree}{最小生成树}的更多相关文章
- HDU 2489 Minimal Ratio Tree 最小生成树+DFS
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- HDU 2489 Minimal Ratio Tree(暴力+最小生成树)(2008 Asia Regional Beijing)
Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated accord ...
- HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...
- hdu2489 Minimal Ratio Tree
hdu2489 Minimal Ratio Tree 题意:一个 至多 n=15 的 完全图 ,求 含有 m 个节点的树 使 边权和 除 点权和 最小 题解:枚举 m 个 点 ,然后 求 最小生成树 ...
- HDUOJ----2489 Minimal Ratio Tree
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Minimal Ratio Tree HDU - 2489
Minimal Ratio Tree HDU - 2489 暴力枚举点,然后跑最小生成树得到这些点时的最小边权之和. 由于枚举的时候本来就是按照字典序的,不需要额外判. 错误原因:要求输出的结尾不能有 ...
- HDU 2489 Minimal Ratio Tree(prim+DFS)
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
随机推荐
- MyBatis学习(一)、MyBatis简介与配置MyBatis+Spring+MySql
一.MyBatis简介与配置MyBatis+Spring+MySql 1.1MyBatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的J ...
- C# 随机红包算法
static void Main(string[] args) { ; ; double minAmount = 0.01; Random r = new Random(); ; i < num ...
- 测试Javacript里的checkbox是否被选中的status和checked的替换方法
测试Javacript里的checkbox是否被选中的status和checked的替换方法,checkbox.checked和checkbox.status的功能一样,注意checkbox.stat ...
- 如何在Ubuntu下的VirtualBox虚拟机(Windows XP)里挂载/使用U盘 (转载)
文章来源:http://www.codelast.com/ 在Ubuntu下安装了VirtualBox之后,如果你的虚拟机安装的是Windows XP系统,那么,你会发现,当你插上U盘时,无论你怎么折 ...
- jQuery选择器大全
1. id选择器(指定id元素) 将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () { $('#one ...
- ActiveX控件打包、签名、嵌入详解
ActiveX控件打包.签名.嵌入详解 前言 在我们的一个项目中,使用到了大华网络监控摄像头枪机,网络上下载了其ActiveX插件,但是发现其所提供的类库没有打包处理.这就导致我们每次给用户安装的时候 ...
- eclipse NoClassDefFoundError错误
问题描述:eclipse中执行一个java web项目,代码中依赖都是正常的,发布到tomcat中调试就提示NoClassDefFoundError错误, 问题分析:首先确定工程中该类确实存在,因为代 ...
- Java导出Word利用freemarker(含图片)
制作Word模版 建议使用高版本的office做,尽量不要用WPS做,生成xml会出现乱码 编码要统一,推荐UTF-8 建好模板,将模板另存为xml格式,建议原来模板不要删,xml的如果后期打不开,还 ...
- 【Python】【学习笔记】持续更新
调用模块的两种方式: #方式1 from decimal import Decimal Decimal('1.00') #方式2 import decimal decimal.Decimal('1.0 ...
- C# 访问https 未能创建 SSL/TLS 安全通道
C# 访问https请求被中止: 未能创建 SSL/TLS 安全通道(Could not create SSL/TLS secure channel) 一般GetResponse可以直接访问https ...