题意:

给你n个点的图,然后让你在图里挑m个点,达到sumedge/sumnode最小

思路:

由于数据范围小,状压枚举符合m个点的状态,我是用vactor存了结点位置,也记录了结点的sum值,然后跑一发最小生成树就可以知道sumedge,这里判断可以利用乘法,然后更新一个状态就好了;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; int ma[20][20];
int val[20];
int sumnode,sumedge;
int n,m;
int cnt;
int a,b;
int dis[20];
vector<int>pb;
bool vis[20]; int prim()
{
memset(vis,0,sizeof(vis));
dis[pb[0]]=0;
vis[pb[0]]=1;
for(int i=1;i<pb.size();i++)
{
dis[pb[i]]=ma[pb[0]][pb[i]]?ma[pb[0]][pb[i]]:1000000;
}
int ans=0;
for(int i=1;i<=m;i++)
{
int k=-1;
int mimi=1000000;
for(int j=0;j<pb.size();j++)
{
if(vis[pb[j]]) continue;
if(dis[pb[j]]<mimi)
{
mimi=dis[pb[j]];
k=j;
}
}
if(k==-1)
break;
vis[pb[k]]=1;
for(int j=0;j<pb.size();j++)
{
if(ma[pb[k]][pb[j]]&&!vis[pb[j]]&&dis[pb[j]]>ma[pb[k]][pb[j]])
dis[pb[j]]=ma[pb[k]][pb[j]];
}
}
for(int i=0;i<pb.size();i++)
{
ans+=dis[pb[i]];
}
return ans;
} int main()
{
while(scanf("%d%d",&n,&m))
{
if(!n&&!m) 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",&ma[i][j]);
if(ma[i][j]==0)
ma[i][j]=1000000;
}
a=1000000;
b=1;
int build=1<<n;
int ans;
for(int i=0;i<=build;i++)
{
int cnt=0;
sumnode=0;
pb.clear();
for(int j=0;j<n;j++)
{
if(i&(1<<j))
{
cnt++;
pb.push_back(j);
sumnode+=val[j];
}
}
if(cnt==m)
{
int sumedge=prim();
if(a*sumnode>sumedge*b)
{
a=sumedge;
b=sumnode;
ans=i;
}
}
}
int flag=0;
for(int i=0;i<n;i++)
{
if(ans&(1<<i))
{
if(flag) printf(" ");
printf("%d",i+1);
flag=1;
}
}
puts("");
}
return 0; }

HDU2489【状压枚举】的更多相关文章

  1. [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)

    题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...

  2. POJ3734【状压枚举】

    题意: 给你两个01矩阵,去掉矩阵B的某些行和某些列,问处理后的矩阵B能否变成矩阵A: 思路: 数据较小,状压枚举B矩阵列的数量=A矩阵列的数量时的状态,然后搞定了列,贪心判断B矩阵的行就好了: #i ...

  3. POJ - 1753 Flip Game(状压枚举)

    https://vjudge.net/problem/POJ-1753 题意 4*4的棋盘,翻转其中的一个棋子,会带动邻接的棋子一起动.现要求把所有棋子都翻成同一种颜色,问最少需要几步. 分析 同一个 ...

  4. POJ 1753 Flip Game(高斯消元+状压枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45691   Accepted: 19590 Descr ...

  5. hdu 4770 状压+枚举

    /* 长记性了,以后对大数组初始化要注意了!140ms 原来是对vis数组进行每次初始化,每次初始化要200*200的复杂度 一直超时,发现没必要这样,直接标记点就行了,只需要一个15的数组用来标记, ...

  6. CF1556F Sports Betting (状压枚举子集DP)

    F 对于一张比赛图,经过缩点,会得到dag,且它一定是transitive的,因此我们能直接把比赛图缩成一个有向链.链头作为一个强连通分量,里面的所有点都是胜利的 定义F(win)表示win集合作为赢 ...

  7. [NYIST32]组合数(状压,枚举,暴力)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=32 求n个数中挑出r个数字的所有情况,最后倒序输出所有情况. 状压枚举所有情况就是了 ...

  8. HDU 5765 Bonds 巧妙状压暴力

    题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...

  9. hdu 5823 color II 状压dp

    题目链接 给n个点 n<=18. 然后给出它们两两之间是否有边相连. 问你这个图的所有子集,最少要用多少种颜色来染色, 如果两个点相连, 那么这两个点不能染同样的颜色. 先预处理出所有的点独立集 ...

随机推荐

  1. Oracle中,将毫秒数转换为timestamp类型的两种方法

    在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以NUMBER类型存储到数据库中,在某些时候方便比较,同样,有些时候我们需要 把这 ...

  2. 模式匹配之尺度空间---scale space

    转载:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html   主要步骤  1).尺度空间的生成:     2).检测尺度 ...

  3. oracle 的sys 和 system 账号

    sys 和 system 账号有啥区别?一直以来懵懵懂懂,只想当然的认为就是权限大小不一样. 但是,它们都是管理员? 现在,我知道有一个区别了: [sys]只能用sysdba身份登录(也许还有syso ...

  4. 海康DS NVR播放URL规则

    URL规定:rtsp://username:password@<address>:<port>/Streaming/Channels/<id>(?parm1=val ...

  5. java之HashMap的遍历Iterator

    package com.ql_2;/* * 功能:HashMap 的使用 */import java.util.*; public class Test_2 { public static void ...

  6. 大数据之ES系列——第一篇 ElasticSearch2.2 集群安装部署

    第一部分  安装准备 准备三台主机节点: hc11.spads  192.168.160.181 hc12.spads  192.168.160.182 hc13.spads  192.168.160 ...

  7. codeforces B. Trees in a Row 解题报告

    题目链接:http://codeforces.com/problemset/problem/402/B 题目意思:给出n个数和公差k,问如何调整使得ai + 1 - ai = k.(1 ≤ i < ...

  8. Django_model进阶

    Django-model进阶   QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Ent ...

  9. dancing link 精确覆盖 重复覆盖 (DLX)

    申明:因为转载的没有给出转载链接,我就把他的链接附上,请尊重原创: http://www.cnblogs.com/-sunshine/p/3358922.html 如果谁知道原创链接 给一下,请尊重原 ...

  10. UVA-10779(最大流)

    题意: Bob与他的朋友交换贴纸;他的这些朋友只交换自己没有的贴纸;且用的是自己所有的重复贴纸;现在要求Bob最大能得到多少张贴纸; 思路: 把人和物品都进行编号,添加原点s和汇点e,s到每个物品连边 ...