题目链接:

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. CF802D

    D. Marmots (easy) time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  2. 九度oj 题目1354:和为S的连续正数序列

    题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...

  3. UVA 11297 Census ——二维线段树

    [题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> # ...

  4. BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 【广义后缀自动机】

    题目 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴 ...

  5. AJAX技术简介

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本的了解: HTML / XHTML CSS JavaScript ...

  6. HDU4405-Aeroplane chess(概率DP求期望)

    Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...

  7. bat常用命令,转【http://www.cnblogs.com/yplong/archive/2013/04/02/2996550.html】

    1.@它的作用是隐藏它后面这一行的命令本身(只能影响当前行).2.echo中文为“反馈”.“回显”的意思.它其实是一个开关命令,就是说它只有两种状态:打开和关闭.于是就有了echo on和echo o ...

  8. Pizza Delivery

    Pizza Delivery 时间限制: 2 Sec  内存限制: 128 MB 题目描述 Alyssa is a college student, living in New Tsukuba Cit ...

  9. 页面中用Context.Handler传递

       最近被WCF弄得身心疲惫.今天抽空看了一下页面传值的一些技巧.传统的cookie session 什么的就不介绍了 今天介绍Context的用法 首先要应用using System.Runtim ...

  10. 【BZOJ2653】middle(主席树,二分)

    题意:一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[ ...