题目链接:

csu 1116

题意:

有一幅双向图连接N个城市(标号1~n,1表示首都)  每一个城市有一个价值W.

地震摧毁了全部道路,现给出可修复的m条道路并给出修复每条道路所需的费用

问在总费用不超过k的情况下,使得  与  首都连通的全部城市  的价值和 最大

解题思路:

点的数量不超过16 ,2^16次方枚举全部城市是否在连通的集合类

再通过kruskal推断这个集合是否合法就可以

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int a,b,w;
}edge[128];
int v[18];
int fa[18];
int sum; void init()
{
for(int i=0;i<18;i++)
fa[i]=i;
sum=0;
} int Find(int x)
{
return x==fa[x]?x:fa[x]=Find(fa[x]);
} int cmp(node a,node b)
{
return a.w<b.w;
} int main()
{
int T,n,m,k;
int ans;
int f1,f2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
ans=0;
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=0;i<m;i++)
scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].w);
sort(edge,edge+m,cmp); //给边排序 保证费用尽量小
int num=(1<<n)-1;
for(int i=0;i<=num;i++)
{
if(i&1)
{
init();
for(int j=0;j<m;j++)
if(i&(1<<edge[j].a-1))
if(i&(1<<edge[j].b-1)) //当前边属于当前的点集
{
f1=Find(edge[j].a);
f2=Find(edge[j].b);
if(f1!=f2)
{
fa[f1]=f2;
sum+=edge[j].w;
}
}
for(int j=1;j<=n;j++)
if((i&(1<<j-1))&&Find(j)!=Find(1)) //当前点集有多余的点
{
sum=k+1;
break;
}
if(sum<=k)
{
sum=0;
for(int j=1;j<=n;j++)
if(i&(1<<j-1))
sum+=v[j];
if(sum>ans)
ans=sum;
}
}
}
printf("%d\n",ans);
}
return 0;
}

csu1116 Kingdoms 最小生成树-枚举状态的更多相关文章

  1. 1315E Double Elimination DP 01枚举状态和倍增思想

    E. Double Elimination DP 01枚举状态和倍增思想 题意 参考DOTA2双败赛制,一共有\(2^n\)个队打n轮 其中你有k喜欢的队伍,由你掌控比赛的输赢请问比赛中包含你喜欢的队 ...

  2. CSU 1116 Kingdoms(枚举最小生成树)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只 ...

  3. 【uva 1151】Buy or Build(图论--最小生成树+二进制枚举状态)

    题意:平面上有N个点(1≤N≤1000),若要新建边,费用是2点的欧几里德距离的平方.另外还有Q个套餐,每个套餐里的点互相联通,总费用为Ci.问让所有N个点连通的最小费用.(2组数据的输出之间要求有换 ...

  4. BNUOJ-26586 Simon the Spider 最小生成树+枚举

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26586 题意:给一个图,每条边有一个权值.要你求选择一棵树,权值和为sum,然后在树上选择 ...

  5. HDU 5025Saving Tang Monk BFS + 二进制枚举状态

    3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...

  6. HDU 1589 Find The Most Comfortable Road 最小生成树+枚举

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. HDU4081 Qin Shi Huang&#39;s National Road System【prim最小生成树+枚举】

    先求出最小生成树,然后枚举树上的边,对于每条边"分别"找出这条割边形成的两个块中点权最大的两个 1.因为结果是A/B.A的变化会引起B的变化,两个制约.无法直接贪心出最大的A/B. ...

  8. Codeforces C The Game of Efil (暴力枚举状态)

    http://codeforces.com/gym/100650 阅读题,边界的cell的邻居要当成一个环形的来算,时间有8s,状态最多2^16种,所以直接暴力枚举就行了.另外一种做法是逆推. #in ...

  9. HDU 4462:Scaring the Birds(暴力枚举+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=4462 题意:有一个n*n的地图,有k个空地可以放稻草人,给出每个空地可以放的稻草人属性,属性中有个R代表这个位置 ...

随机推荐

  1. 五、人生苦短,我用python【第五篇】

    Python基本数据类型 运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为 ...

  2. PHP 判断表单提交的file是否为空

    echo '<pre>'; var_dump($product_attach_files); echo "</pre>"; echo ];

  3. excel设置单元格为文本

    可以使用分裂功能,解决单元格无法设置成文本的问题.

  4. Python 打印嵌套list中每个数据(遍历列表)

    new_list = ["H1","H2",1999] for each_list in new_list: print (each_list); 若列表中包含 ...

  5. 2014·NOIP 新的历程,新的开始

    10.12 从9月1号开始奋战,到了今天终于重新把所有普及和提高的复赛题全部AC了.40多天AC130多道想想也是醉了,也许是机房一群大神给予我的压力吧. 想想暑假,整天玩游戏,与此同时,CZL.CY ...

  6. 转载:CMarkUp使用简介

    转载地址:http://blog.csdn.net/jonathandj/article/details/4320725 最近正在研究C++下的XML分析工具CMarkup.初次和XML相遇是基于C# ...

  7. 【bzoj2393】Cirno的完美算数教室 数论容斥

    Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数 ...

  8. 【bzoj1878】[SDOI2009]HH的项链 - 树状数组 - 离线处理

    [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4834  Solved: 2384[Submit][Status][Dis ...

  9. mysql查询死锁,执行语句,服务器状态等语句集合

    [转]http://blog.csdn.net/enweitech/article/details/52447006

  10. rest-assured 将log()中的信息打印到log日志中去的方法

    rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...