2489 Minimal Ratio Tree 最小生成树(选边)

原创 2012年08月10日 10:29:04

题意: 给n个点及各点间的距离,从中选出m个点 ,使得  边权的和 / 点权的和  最小。

思路: 从n个点中选出m个点(枚举每种可能的情况),计算出它的。。。最小值。所以可以用dfs枚举出各种情况,再用prime算出每种情况的。。。最小值。


#include<iostream>
#include<string.h>
#define INF 999999
using namespace std;
int map[20][20],dis[20];
int vis[20],mark[20],nx[20] , flag[20];
int bian,dian;
int n,m;
int prime(int s  , int temp[20][20])
{
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    int sum = 0;
    int min, rec;
    for(int i=1;i<=n;i++) dis[i] = temp[s][i];
    vis[s]=1;
    for(int i=1;i<n;i++)
    {
        min = INF;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0 && dis[j]< min)
            {
                min = dis[j];
                rec = j;
            }
        }
        vis[rec]=1;
        sum+=min;
        if(i==m-1)  return sum;  //因为每次dis会更新,且只需找m-1条边的最小生成树。 
        for(int j=1;j<=n;j++)
        if(dis[j]> temp[rec][j])  dis[j]=temp[rec][j];
    }
}
void dfs(int g[20] ,  int t , int pre)
{
     if(t==m)  //挑选的点达到m ,可计算其。。。最小值 
     {
          int sum = 0 , s;
          for(int i=1;i<=n;i++)  if(g[i]==1) sum+=nx[i]; //点权和 
          int temp[20][20];         //用temp记录这挑选出的m个点的边的关系 
          for(int i=1;i<=n;i++)
          {
              for(int j=1;j<=n;j++)
              {
                   if(g[i]==0 || g[j]==0) 
                   temp[i][j] =  temp[j][i] = INF;
                   else
                   {
                       s = i;
                       temp[i][j]=map[i][j];
                       temp[j][i]=map[j][i];
                   }
              }
          }
          int cnt =  prime(s ,temp);
          if((cnt*dian - sum*bian)<0) //与之前的最小值比较 
          {
              bian = cnt;
              dian = sum;
              for(int i=1;i<=n;i++) mark[i] = g[i];
          }
     }
     else 
     {
          for(int i=pre ; i<=n;i++)  //枚举,各个点都有可能出现或不出现在m个点中 
          {
               if(g[i]==0)
               {
                   g[i]=1;
                   dfs(g,t+1 , i);
                   g[i]=0;
               }
          }
     }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF && (m+n))
    {
         memset(map,0,sizeof(map));
         memset(mark,0,sizeof(mark));
         memset(flag,0,sizeof(flag));
         bian = INF;  dian = 1;
         for(int i=1;i<=n;i++) scanf("%d",&nx[i]);
         for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
         scanf("%d",&map[i][j]);
         dfs(flag, 0 , 1);
         int count=0;
         for(int i=1;i<=n;i++)
         { 
             if(mark[i]==1) 
             {
                 printf("%d",i);
                 count++;
                 if(count!=m) printf(" ");
             }
         }printf("\n");
    }
    return 0;
}


HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)

链接: HDU : http://acm.hdu.edu.cn/showproblem.php?pid=2489 POJ  : http://poj.org/problem?id=3925 ...
  • shuangde800
  • shuangde800
  • 2012-09-11 00:12:28
  • 2274

HDU 2489 Minimal Ratio Tree (暴力枚举+最小生成树)

题目链接:HDU 2489 Minimal Ratio Tree 题意:给出n,m,n个点的点权和一个n*n的矩阵,(i,j)表示点i到点j的比边权为(i,j),在n个点中选m个点,求最小的rati...
  • u012377575
  • u012377575
  • 2014-10-24 18:04:45
  • 707

POJ 3925 Minimal Ratio Tree(枚举+最小生成树)

POJ 3925 Minimal Ratio Tree 题目链接 题意:给定一些点权和一个边权矩阵,求一个最小的比例的树 思路:先枚举用哪些点,然后求最小生成树即可 代码: ...
  • u011217342
  • u011217342
  • 2014-11-28 18:46:00
  • 1078

hdu 2489 Minimal Ratio Tree(枚举+最小生成树)

题意:给出n个点的完全图,每个节点和边都有权值,求m个点,并且令m生成的树边权和与点权和比例最小。 思路:直接枚举所有情况,然后做最小生成树就行了。。。 代码: #include #in...
  • qian99
  • qian99
  • 2014-01-31 21:35:00
  • 532

HDU 2489 Minimal Ratio Tree(图论-最小生成树)

题目大意: 给你一张图n个点,每个点有权值,问你从中选出m个点,使得最小,输出方案。 解题思路: 用二进制取与不取来枚举选出m个点的方案,分母就确定了,分子越小越好,所以通过最小生成树算出。...
  • wujy47
  • wujy47
  • 2014-08-03 18:07:19
  • 433

hdoj 2489 Minimal Ratio Tree(搜索+最小生成树)

Minimal Ratio TreeTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • wx2306
  • wx2306
  • 2018-04-10 16:31:36
  • 9

hdu 2489 - Minimal Ratio Tree(最小生成树)

题意:大意就是有边权,有点权,求选定m个点,生成一颗树,使k=选定边权/点权 最小。 思路:枚举+kruskal 枚举由于每个点可以选和不选,而且最多也就20个点,所以直接上2进制,1表示选,0表...
  • m0_37253730
  • m0_37253730
  • 2017-05-16 23:46:35
  • 66

hdu 2489 Minimal Ratio Tree 最小生成树+状态压缩

题目问的就是,从n个点中选m个点,生成树值和点的权值比例最小,用二进制来枚举全部情况。#include #include #include using namespace std; const int...
  • xinag578
  • xinag578
  • 2015-12-09 23:01:21
  • 176

HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)

HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
  • u012860063
  • u012860063
  • 2014-10-23 19:47:59
  • 1277

最小生成树(Minimal Spanning Tree MST)--《算法导论》

MST: 简单的说就是给定一个连通的无向图,并给每一条边赋予权重w(u,v)w(u,v),在其中找出一个边集AA,使得AA链接所有的顶点,并使得这些VV和这个边集AA一起构成一棵树T=(V,A)T=...
  • Dylan_Frank
  • Dylan_Frank
  • 2016-08-25 19:16:28
  • 733
收藏助手
不良信息举报
您举报文章:2489 Minimal Ratio Tree 最小生成树(选边)
举报原因:
原因补充:

(最多只允许输入30个字)