{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 ...
随机推荐
- 用两个Stack来实现一个Queue
import java.util.Stack; /** * 问题:用两个Stack来实现一个Queue; * 方法:栈的特点是先进后出:而队列的特点是先进先出: * 用两个栈正好能把顺序调过来: * ...
- 【uTenux】学习一个嵌入式操作系统-uTenux
[这个是汇总] 最近有点时间,参加了EEPW论坛和悠龙咨询组织的一个嵌入式操作系统uTenux试用活动.本来想借助这个活动提供的开发板做一个小项目,奈何OS使用功底太次.于是,这个活动被我降低到了学习 ...
- git学习1:git安装和配置
Git是什么?世界上最先进的分布式版本控制系统,记录了一个文本文件的每次一修改信息,比如,一篇散文,从草稿到最终出版,经历过无数次修改,修改了标点符号形成一个版本,老师帮助修改形成一个版本,同学帮忙修 ...
- [MongDB] 主从架构--官方极力不推荐
一.缘由: 看着数据库大家庭都有主从模式,想着Mongodb应该也不会落下.但从官网看来,先是早先舍弃了Master-Master模式,现在又在不推荐 Master-Slave模式,这是要标新立异呀. ...
- JVM实用参数(八)GC日志
本系列的最后一部分是有关垃圾收集(GC)日志的JVM参数.GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配 ...
- 扁平设备树(FDT)
组成 扁平设备树主要由4大部分组成:头部(header),预留内存块(memory reservation block),结构块(struct block)和字符串块(strings block).这 ...
- firefox火狐浏览器过滤广告插件:Adblock Plus
firefox火狐浏览器过滤广告插件:Adblock Plus
- Creating a radius based VPN with support for Windows clients
This article discusses setting up up an integrated IPSec/L2TP VPN using Radius and integrating it wi ...
- Android 进程通信机制之 AIDL
什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...
- 集成 Kendo UI for Angular 2 控件
伴随着 Angular 2 的正式 release,Kendo UI for Angular 2 的第一批控件已经发布了,当前是 Beta 版本,免费使用. 官方站点:Kendo UI for Ang ...