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秒 ...
随机推荐
- hdu 2952 Counting Sheep
本题来自:http://acm.hdu.edu.cn/showproblem.php?pid=2952 题意:上下左右4个方向为一群.搜索有几群羊 #include <stdio.h> # ...
- 一句命令快速合并 JS、CSS
在项目开发环境下,我们会把 JS 代码尽可能模块化,方便管理和修改,这就避免不了会出现一个项目自身 JS 文件数量达到 10 个或者更多. 而项目上线后,会要求将所有 JS 文件合并为 1 个或者几个 ...
- 微信公共平台开发1 .net
如果想通过微信去开发(当然,指的是开发模式下),首先 建议先申请一个服务号,因为服务号的功能与接口也多,有些功能订阅号是实现不了的.另外申请过以后必须得通过微信 认证才能开发,好像是得付300大洋,高 ...
- 讲解Canvas中的一些重要方法
Canvas所提供的各种方法根据功能来看大致可以分为几类: 第一是以drawXXX为主的绘制方法: 第二是以clipXXX为主的裁剪方法: 第三是以scale.skew.translate和rotat ...
- Android ListView用EditText实现搜索功能
前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能.即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表.我把这个功能抽取出来了,先贴一下效果图: 分析 在查阅 ...
- Android中进程与线程
常说的主线程(UI线程)是什么? 当一个Android程序刚启动的时候,我们的android系统就会启动一个带有一个单一线程的linux进程.默认情况下,所有的组件比如Activity都运行在同样的一 ...
- 使用SharedPreferences进行简单的储存
博客地址 http://www.cnblogs.com/mmyblogs/p/6082512.html(转载请保留) SharedPreferences定义 1.是一种轻型的数据存储的方式 2.本质是 ...
- Android WebView 向上向下滑动监听
在手势的 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {}代码 ...
- 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"]; UIBarButtonItem *barbtn=[[[U ...
- Swift中的类和结构体的相同点与不同点
相同点: 1.都是有内部变量和函数 2.都可以有内部下标方式去取属性 3.都可以有初始化函数 4.都可以用协议 不同点: 1.类有继承 2.类可以多重引用 3.类有析构