{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 ...
随机推荐
- bzoj1904: Musical Water-fence
找出最高的木块,假设在这块木块上无限加水,就会形成一些水池,然后才向两侧溢出 用并查集维护当前在某个位置使水向左/右流动,水会流向哪个水池或从某一侧溢出浪费,当某个水池满时更新并查集 #include ...
- 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服 ...
- Mysql5.5源码安装步骤笔记记录
1.cmake软件的安装wget https://cmake.org/files/v3.5/cmake-3.5.0-rc3.tar.gztar xf cmake-3.5.0.tar.gzcd cmak ...
- android studio 各种问题
1.dexDebug ExecException finished with non-zero exit value 2 全bug日志如下: (Error:Execution failed for t ...
- TCP 常用总结
SO_RCVBUF SO_SNDBUF TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲 ...
- future
/*T ->return type, E -> error type, D -> parameter type */ template<typename T, typename ...
- Java生成XML文件
我们在数据库中的数据可以将其提取出来生成XML文件,方便传输.例如数据库中有Admin这张表: 我们写一个java类表示admin数据: package xmlDom.vo; import java. ...
- prim算法查找最小生成树
我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...
- Linux 命令与文件的搜寻
平时会偶尔忘记一些命令或者文件,下面的这些命令能够帮我们快速的找到命令或者文件 1. 命令的搜寻 命令:which 功能:在PATH配置的目录下搜寻命令 用法:which [-a] [command] ...
- Solr整合Ansj中文分词器
Ansj的使用和相关资料下载参考:http://iamyida.iteye.com/blog/2220833 参考 http://www.cnblogs.com/luxh/p/5016894.html ...