题意:给你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的更多相关文章

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

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

  2. csuoj 1116: Kingdoms

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 1116: Kingdoms Time Limit: 3 Sec  Memory Limit ...

  3. csu1116 Kingdoms 最小生成树-枚举状态

    题目链接: csu 1116 题意: 有一幅双向图连接N个城市(标号1~n,1表示首都)  每一个城市有一个价值W. 地震摧毁了全部道路,现给出可修复的m条道路并给出修复每条道路所需的费用 问在总费用 ...

  4. csu 1812: 三角形和矩形 凸包

    传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************** ...

  5. BZOJ 1116: [POI2008]CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 922  Solved: 514[Submit][Status][ ...

  6. CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这 ...

  7. CSU 1120 病毒(DP)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120 解题报告:dp,用一个串去更新另一个串,递推方程是: if(b[i] > a ...

  8. CSU 1113 Updating a Dictionary(map容器应用)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...

  9. CSU 1333 Funny Car Racing (最短路)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333 解题报告:一个图里面有n个点和m条单向边,注意是单向边,然后每条路开a秒关闭b秒 ...

随机推荐

  1. hdu 2952 Counting Sheep

    本题来自:http://acm.hdu.edu.cn/showproblem.php?pid=2952 题意:上下左右4个方向为一群.搜索有几群羊 #include <stdio.h> # ...

  2. 一句命令快速合并 JS、CSS

    在项目开发环境下,我们会把 JS 代码尽可能模块化,方便管理和修改,这就避免不了会出现一个项目自身 JS 文件数量达到 10 个或者更多. 而项目上线后,会要求将所有 JS 文件合并为 1 个或者几个 ...

  3. 微信公共平台开发1 .net

    如果想通过微信去开发(当然,指的是开发模式下),首先 建议先申请一个服务号,因为服务号的功能与接口也多,有些功能订阅号是实现不了的.另外申请过以后必须得通过微信 认证才能开发,好像是得付300大洋,高 ...

  4. 讲解Canvas中的一些重要方法

    Canvas所提供的各种方法根据功能来看大致可以分为几类: 第一是以drawXXX为主的绘制方法: 第二是以clipXXX为主的裁剪方法: 第三是以scale.skew.translate和rotat ...

  5. Android ListView用EditText实现搜索功能

    前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能.即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表.我把这个功能抽取出来了,先贴一下效果图: 分析 在查阅 ...

  6. Android中进程与线程

    常说的主线程(UI线程)是什么? 当一个Android程序刚启动的时候,我们的android系统就会启动一个带有一个单一线程的linux进程.默认情况下,所有的组件比如Activity都运行在同样的一 ...

  7. 使用SharedPreferences进行简单的储存

    博客地址 http://www.cnblogs.com/mmyblogs/p/6082512.html(转载请保留) SharedPreferences定义 1.是一种轻型的数据存储的方式 2.本质是 ...

  8. Android WebView 向上向下滑动监听

    在手势的 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,   float velocityY) {}代码 ...

  9. 【原】自定义UINavigationItem的两种方法以及相应的隐藏方法

    第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"]; UIBarButtonItem *barbtn=[[[U ...

  10. Swift中的类和结构体的相同点与不同点

     相同点: 1.都是有内部变量和函数 2.都可以有内部下标方式去取属性 3.都可以有初始化函数 4.都可以用协议   不同点: 1.类有继承 2.类可以多重引用 3.类有析构