[BZOJ3380] [USACO2004 Open]Cave Cows 1 洞穴里的牛之一
Description
 很少人知道其实奶牛非常喜欢到洞穴里面去探险。
 洞窟里有N(1≤N≤100)个洞室,由M(1≤M≤1000)条双向通道连接着它们.每对洞室间
至多只有一条双向通道.有K(1≤K≤14)个洞室,里面放有1捆干草.牛吃1捆干草,体重指数就会增加1.
 贪吃的贝茜要到洞窟里面探险.她希望能吃尽量多的干草,但每条通道有一个宽度阈值,如果体重指数超过相应的阈值,贝茜就会被卡祝她从洞窟1出发,体重指数为0.在洞里溜达一圈后,她要返回洞窟1. 那她最多能吃多少捆干草呢?注意,贝茜经过一个洞室,不一定非要吃掉里面的干草.
Input
 第1行输入N,M,K,之后K行每行一个整数,表示在这个洞室放有一捆干草;接下来M行每行三个整数,表示一条双向通道的起点终点和宽度阈值.
Output
 最多能吃掉的干草数.
Sample Input
6 7 5
1
2
3
4
5
1 2 3
3 6 2
6 2 10
2 4 1
5 1 1
4 5 1
1 6 1
Sample Output
4
Solution
设\(f[x][s]\)表示在点\(x\)吃了状态\(s\)的所有干草合不合法。
那么直接暴力转移就好了。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define ll long long 
const int maxn = 101;
const int inf = 1e9;
const lf eps = 1e-8;
int f[101][(1<<14)+10],n,m,k,id[101];
int head[maxn],tot,cnt[(1<<14)+10];
struct edge{int to,nxt,w;}e[maxn<<5];
void add(int u,int v,int w) {e[++tot]=(edge){v,head[u],w},head[u]=tot;}
void ins(int u,int v,int w) {add(u,v,w),add(v,u,w);}
int main() {
	read(n),read(m),read(k);
	for(int i=1,x;i<=k;i++) read(x),id[x]=i;
	for(int i=1,x,y,z;i<=m;i++) read(x),read(y),read(z),ins(x,y,z);
	for(int i=1;i<1<<k;i++) cnt[i]=__builtin_popcount(i);
	queue<pair<int,int >  > q;
	q.push(make_pair(1,0));f[1][0]=1;
	while(!q.empty()) {
		int now=q.front().first,s=q.front().second;q.pop();
		for(int i=head[now];i;i=e[i].nxt) {
			if(!f[now][s]) continue;
			if(e[i].w<cnt[s]) continue;
			if(!f[e[i].to][s]) f[e[i].to][s]=1,q.push(make_pair(e[i].to,s));
			if(id[now])
				if(!(s>>(id[now]-1)&1))
					if(e[i].w>cnt[s])
						if(!f[e[i].to][s|(1<<(id[now]-1))])
							f[e[i].to][s|(1<<(id[now]-1))]=1,q.push(make_pair(e[i].to,s|(1<<(id[now]-1))));
		}
	}
	int ans=0,t=id[1]?1<<(id[1]-1):0;
	for(int i=0;i<1<<k;i++)
		if(f[1][i]) ans=max(ans,cnt[i|t]);
	write(ans);
	return 0;
}
												
											[BZOJ3380] [USACO2004 Open]Cave Cows 1 洞穴里的牛之一的更多相关文章
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
		
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
 - 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二
		
3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 21 Solved ...
 - Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一
		
3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 64 Solved ...
 - bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四*
		
bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四 题意: 平面直角坐标系有n个点,从(0,0)出发,从一个点上可以跳到所有与它横纵坐标距离都≤2的点上,求最少步数 ...
 - bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二*
		
bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 题意: RMQ问题.序列长度≤25000,问题数≤25000. 题解: 倍增. 代码: #include < ...
 - P3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一
		
还是蛮简单的一道题,首先dfs一遍,在所有能到达放有干草的洞穴的所有路径中,找出路径上最小伐值的最大值,按这个值由小到大,再来一遍贪心就行了,能放就放,不能放拉倒(也可以理解为,不能放把最前一个删了) ...
 - P3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四
		
这个系列总算是做完了,这是我第一次高效率做完四道题,虽然中间有两道水题,但是第一和第四题还是蛮好的,但是只要能想到思路就很快能打完的. 像这道题,刚开始在想能不能用DP?但是苦于不知道怎么实施,后来又 ...
 - P3382: [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三
		
首先,我们先确定,最长的曼哈顿距离只可能为 x1+y2-(x2+y2) 和 x1-y1-(x2-y2) 所以我们只需要维护四个值, 分别代表 max(x+y) ; max(x-y) ; min(x+y ...
 - P3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二
		
这题..思维上远没有上一题复杂,是一个裸的RMQ..利用倍增就可以解决了. var n,q,i,j,f,t,c:longint; a:array[..,..] of longint; function ...
 
随机推荐
- Ubuntu 18启动失败  Started Hold until boot procss finishes up
			
原因: 启动ubuntu 的时候,磁盘空间不够了. 解决方法: 启动Ubuntu 的时候,选择Advanced options for Ubuntu 然后选择recovery 之后选择clean 清理 ...
 - mysql using filesort  Using temporary
			
using filesort 一般人的回答是: “当行数据太大,导致内存无法容下这些数据产生的临时表时,他们就会被放入磁盘中排序.” 很不幸,这个答案是错的 ,临时表在太大的时候确实会到磁盘离去,但 ...
 - UpdateLog
			
2014-10-20 增加数据适配器,使支持多数据库类型2015-01-08 增加没有主键ID的抽象类,使能自义主键字段实现MODEL 增加虚拟字段转换,将指定函数或语法转换为对象属性,灵活性更大了 ...
 - 图的基本算法(BFS和DFS)
			
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...
 - pygame安装【在pycharm的IDE project下】
			
pygame安装[在pycharm的IDE project下] 首先更新电脑的pip.exe[命令行下面] 然后进入IDE project ——>setting 中查找是否安装pygame 我的 ...
 - Appium(Python)驱动手机淘宝App
			
请注意操作步骤: 1. 用数据线连接手机, 打开开发者模式, 并赋予相关权限, 并保持不锁屏状态: 2. 启动Appium桌面服务端: 3. 运行程序: 首次运行, Appium会在手机上安装3个Ap ...
 - 怎样下载Firefox与Chrome浏览器驱动
			
在浏览器地址栏输入https://www.seleniumhq.org/ 打开Selenium官网 下载Firefox浏览器驱动 解压到本地 下载Chrome浏览器驱动 解压到本地 把这2个驱动放到P ...
 - JavaWeb--------JSP语法基础学习(特别适合入门)
			
准备工作: 需要Tomcat8.0,MyEclipse,JDK JSP是一种运行在服务器端的脚本语言,JSP页面又是基于HTML网页的程序,它是Java Web 开发技术的基础. 基本内容: JSP页 ...
 - 【hidden】微信小程序hidden属性使用示例
			
hidden属性用于隐藏标签,代码示例: <view hidden="{{!statusTag}}">我出来了~</view> <button bin ...
 - TCP/IP协议的学习笔记
			
1.OSI和TCP/IP的协议体系结构 OSI是开放系统互连参考模型,它的七层体系结构概念清楚,理论也比较完整,但它既复杂又不实用.而TCP/IP是一个四层的体系结构,它包含应用层.传输层.网际层和网 ...