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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdu2489Minimal Ratio Tree 最小生成树

//给一个完全图,在其中找一颗树,使得边的权值之和除以点的权值之和最小 //由于n<=15,直接暴力枚举所有选的点的情况,在从这些点找最小生成树 #include #include #include ...
  • cq_pf
  • cq_pf
  • 2015-08-03 15:17
  • 462

HDU2489Minimal Ratio Tree(最小生成树+状态压缩)

Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe...

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

该题就是最小生成树算法的变形,由于这个比值没有什么规律,不可能一下子算出最小情况,我们可以很容易发现,结点数非常少,所以我们可以枚举出m个结点的所有组合,这样,结点权值只和就确定了,为了使得比值最小,...

dfs枚举 + 最小生成树 hdoj2489 Minimal Ratio Tree

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2489题目大意是,给你一个图,这个图不仅有边权,还有点权,图中共有n个点,问做一棵包含m个结点的生成树...

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

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

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

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

HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】

Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...

hdu 2489 Minimal Ratio Tree DFS枚举点+最小生成树 属于中等偏上题 ,Double比较大小的时候注意精度问题

Problem Description For a tree, which nodes and edges are all weighted, the ratio of it is calculate...

HDU-2489 Minimal Ratio Tree(最小生成树[Prim])

好多次都能想到正解,但是不敢去写,还是需要勇于尝试,不断地尝试才能有更多的理解。 数据范围很小,枚举每一种点的组合情况即可。

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

题目链接:HDU 2489 Minimal Ratio Tree 题意:给出n,m,n个点的点权和一个n*n的矩阵,(i,j)表示点i到点j的比边权为(i,j),在n个点中选m个点,求最小的rati...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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