CSU 1116 Kingdoms(枚举最小生成树)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116
解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只有K个金币,每个城市有一些人,要你求怎么修路使得总的费用在K的范围内,同时使得跟首都连接的城市的人口(包括首都的人口)要最多,问最多的人口是多少。
枚举连接哪些城市,然后分别构造最小生成树。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = ;
int pop[maxn],mat[maxn][maxn];
int T,n,m,k; int prim(int d,int& ans)
{
int visit[maxn],f = ;
memset(visit,,sizeof(visit));
d = (d << ) + ;
for(int i = ;i <= n;++i)
{
visit[i] = d & ;
d >>= ;
}
int tot = ;
visit[] = ; //等于2才是在集合中的
while()
{
int l = -,temp = 0x7fffffff;
for(int i = ;i <= n;++i)
if(visit[i] == )
{
for(int j = ;j <= n;++j)
if(visit[j] == && mat[i][j] < temp)
{
l = j;
temp = mat[i][j];
}
}
if(l == - || temp > ) break;
tot += temp;
visit[l] = ;
}
ans = ;
for(int i = ;i <= n;++i)
if(visit[i] == )
ans += pop[i];
return tot;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i = ;i <= n;++i)
scanf("%d",&pop[i]);
int x,y,z;
memset(mat,0x3f,sizeof(mat));
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
mat[x][y] = mat[y][x] = min(mat[x][y],z);
}
int tot = ,t;
for(int i = ;i <= ( << (n-))-;++i)
{
int temp = prim(i,t);
if(temp <= k) tot = max(tot,t);
}
printf("%d\n",tot);
}
return ;
}
CSU 1116 Kingdoms(枚举最小生成树)的更多相关文章
- CSU 1116 Kingdoms
题意:给你n个城市,m条被摧毁的道路,每条道路修复需要c元,总共有k元,给你每个城市的人口,问在总费用不超过k的情况下 与1号城市相连的城市的最大总人口(包括1号城市) 思路:1号城市是必取的,剩余最 ...
- csuoj 1116: Kingdoms
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 1116: Kingdoms Time Limit: 3 Sec Memory Limit ...
- UVA1395 Slim Span(枚举最小生成树)
题意: 求最小生成树中,最大的边减去最小的边 最小值. 看了题解发现真简单=_= 将每条边进行从小到大排序,然后从最小到大一次枚举最小生成树,当构成生成树的时候,更新最小值 #include < ...
- Poj(2784),二进制枚举最小生成树
题目链接:http://poj.org/problem?id=2784 Buy or Build Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- 【HDOJ1598】【枚举+最小生成树】
http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/1000 ...
- hdu 2489(枚举 + 最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 思路:由于N, M的范围比较少,直接枚举所有的可能情况,然后求MST判断即可. #include ...
- hdu1598 find the most comfortable road 枚举+最小生成树
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 210 #define IN ...
随机推荐
- Git更新到最新版本
添加git的ppa源sudo apt-add-repository ppa:git-core/ppasudo apt-get updatesudo apt-get upgrade
- ::before/:before和::after/:after的使用
::before/:before和::after/:after的使用 之前总是可以看到::before :before ::after :after,但是没有使用过,今天查了些资料,终于知道了他们的关 ...
- hbase shell command
进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成 ...
- Java排序算法——表插入排序
//================================================= // File Name : ListInsertSort_demo //----------- ...
- Java数据库——连接关闭、增删改查
连接数据库 //================================================= // File Name : MySQL_demo //-------------- ...
- HTTP Status Code [RFC]
来源:http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Prot ...
- 通过Ajax方式上传文件,使用FormData进行Ajax请求
通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...
- php基础语句2
计算一个月有多少天 $count = date("t",strtotime("2014-09-01")); // 一个月有多少天
- 工具,百度编辑器 UEditor 使用实例化
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...