CSU 1116 Kingdoms
题意:给你n个城市,m条被摧毁的道路,每条道路修复需要c元,总共有k元,给你每个城市的人口,问在总费用不超过k的情况下 与1号城市相连的城市的最大总人口(包括1号城市)
思路:1号城市是必取的,剩余最多15个城市,枚举每个城市与一号城市的联通状态,共有2^15种,每一种情况跑最小生成树。
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=,INF=0x3f3f3f3f;
int p[N],mark[N],a[N][N],low[N],z[N];
int n,m,k,ans,sum;
int prim()
{
int i,j,ans=;
memset(p,,sizeof(p));
p[]=;
for(j=;j<=n;j++)
{
if(mark[j])
low[j]=a[][j];
}
for(i=;i<n;i++)
{
int mi=INF,po;
for(j=;j<=n;j++)
{
if(!p[j]&&mark[j]&&low[j]<mi)
mi=low[j],po=j;
}
if(mi==INF)break;
p[po]=;
ans+=mi;
for(j=;j<=n;j++)
{
if(!p[j]&&mark[j]&&low[j]>a[po][j])
low[j]=a[po][j];
}
}
sum=;
for(i=;i<=n;i++)
if(p[i]&&mark[i])//标记了的点才可以算进总人口
sum+=z[i];
return ans;
}
void dfs(int d)
{
if(d>n)
{
int cnt=prim();
if(sum>ans&&cnt<=k)
ans=sum;
return ;
}
mark[d]=;dfs(d+);
mark[d]=;dfs(d+);
}
int main()
{
int i,j,u,v,w,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(a,0x3f,sizeof(a));
for(i=;i<=n;i++)
scanf("%d",&z[i]);
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
if(w<a[u][v])
a[u][v]=a[v][u]=w;
}
ans=;mark[]=;
dfs();
printf("%d\n",ans);
}
return ;
}
上面的代码枚举是通过搜索,下面一种是通过位运算。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=,INF=0x3f3f3f3f;
int p[N],mark[N],a[N][N],low[N],z[N];
int n,m,k,ans,sum;
int prim(int x)
{
int i,j,ans=;
for(i=;i<=n;i++)
{
mark[i]=x&;
x>>=;
}
memset(p,,sizeof(p));
p[]=;
for(j=;j<=n;j++)
{
if(mark[j])
low[j]=a[][j];
}
for(i=;i<n;i++)
{
int mi=INF,po;
for(j=;j<=n;j++)
{
if(!p[j]&&mark[j]&&low[j]<mi)
mi=low[j],po=j;
}
if(mi==INF)break;
p[po]=;
ans+=mi;
for(j=;j<=n;j++)
{
if(!p[j]&&mark[j]&&low[j]>a[po][j])
low[j]=a[po][j];
}
}
sum=;
for(i=;i<=n;i++)
if(p[i]&&mark[i])
sum+=z[i];
return ans;
}
int main()
{
int i,j,u,v,w,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(a,0x3f,sizeof(a));
for(i=;i<=n;i++)
scanf("%d",&z[i]);
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
if(w<a[u][v])
a[u][v]=a[v][u]=w;
}
ans=;
for(i=;i<=(<<n)-;i++)
{
if(i&)
{
int tmp=prim(i);
if(tmp<=k&&sum>ans)
ans=sum;
}
}
printf("%d\n",ans);
}
return ;
}
CSU 1116 Kingdoms的更多相关文章
- CSU 1116 Kingdoms(枚举最小生成树)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只 ...
- csuoj 1116: Kingdoms
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 1116: Kingdoms Time Limit: 3 Sec Memory Limit ...
- csu1116 Kingdoms 最小生成树-枚举状态
题目链接: csu 1116 题意: 有一幅双向图连接N个城市(标号1~n,1表示首都) 每一个城市有一个价值W. 地震摧毁了全部道路,现给出可修复的m条道路并给出修复每条道路所需的费用 问在总费用 ...
- csu 1812: 三角形和矩形 凸包
传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************** ...
- BZOJ 1116: [POI2008]CLO
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 922 Solved: 514[Submit][Status][ ...
- CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这 ...
- CSU 1120 病毒(DP)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120 解题报告:dp,用一个串去更新另一个串,递推方程是: if(b[i] > a ...
- CSU 1113 Updating a Dictionary(map容器应用)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...
- CSU 1333 Funny Car Racing (最短路)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333 解题报告:一个图里面有n个点和m条单向边,注意是单向边,然后每条路开a秒关闭b秒 ...
随机推荐
- 【Asphyre引擎】Asphyre时隔3年,更名为PXL,全平台支持!
ps:回忆日志 新版本10月初就推出了,我第一时间(10.2日更新,我当天就看到了)下载下来.发现部分Demo需要XE8才能编译通过,又去下载了一个XE8.折腾完已经深夜,只是粗粗的把Demo都编译了 ...
- Mvc下异步断点续传大文件
最近公司一同事咨询了一个MVC项目下上传大文件时遇到的问题,问题描述如下: MVC项目中,当上传比较大的文件时,速度非常慢,小文件基本没有影响. 原因分析: 如果是用传统的form表单去提交的话,会将 ...
- [Windows Phone] APP上架,遇到错误2001的解决方案。(Error:2001)
[Windows Phone] APP上架,遇到错误2001的解决方案.(Error:2001) 问题情景 最近在开始玩Windows Phone的开发,开发的过程中虽然有点小挫折,但是参考网络许多前 ...
- js用8421码实现10进制转2进制
今天早上突然心血来潮决定用 ''和js来撸一个进制转换.(纯属心血来潮,有兴趣的可以看看.) 我们知道,通过8421码.可以快速的得到一个10进制的2进制.如下图: 如上图所示:我们将10进制的 '1 ...
- swift学习笔记之-类型转换
//类型转换 import UIKit /*类型转换(Type Casting) 1.类型转换 可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 2.类型转换使用 is 和 as 操作符实 ...
- 使用Kindle4rss推送自己感兴趣的博文
微信是个好东西,信息量超大,正能量的东西居多,但信息过载的滋味也很不好受,浏览了一大堆铺天盖地的信息后,关上手机后大脑又重新回到空白.所以还是喜欢用RSS聚合功能,自己去订阅优秀的博客或新闻,当有更新 ...
- [Android]ViewPager如何只初始化一个页面
使用过ViewPager的应该都知道,ViewPager的setoffscreenpagelimit()方法,使用该方法可以设置在ViewPager滑动时,左右两侧各保存多少个页面,那我们直接设置se ...
- 无需cygwin,使用NDK进行开发
NDK从7开始自带编译器,在windows上无需配置cygwin的环境. 在eclips中配置NDK路径 在eclipse中点击菜单栏window-Perferences,配置NDK的路径. 在工程中 ...
- 错误:升级为xcode8之后无法上网的解决方法
主要是在info.list中增加以下的节点,因为XCode开始所有的http都转为https来联网了. 添加类型为Dictionary的:NSAppTransportSecurity 再添加节点为:N ...
- WPF x名称空间
X是映射XML名称空间时给他取的名字.X名称空间里面的成员是专门给XAML编译器看的.用来引导XAML编译器把XAML代码编译成CLR代码的,他是取的XAML的首字母X. XAML有自己的编译器,会吧 ...