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

  1. 6 7 5
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 1 2 3
  8. 3 6 2
  9. 6 2 10
  10. 2 4 1
  11. 5 1 1
  12. 4 5 1
  13. 1 6 1

Sample Output

  1. 4

Solution

设\(f[x][s]\)表示在点\(x\)吃了状态\(s\)的所有干草合不合法。

那么直接暴力转移就好了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void read(int &x) {
  4. x=0;int f=1;char ch=getchar();
  5. for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
  6. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
  7. }
  8. void print(int x) {
  9. if(x<0) putchar('-'),x=-x;
  10. if(!x) return ;print(x/10),putchar(x%10+48);
  11. }
  12. void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
  13. #define lf double
  14. #define ll long long
  15. const int maxn = 101;
  16. const int inf = 1e9;
  17. const lf eps = 1e-8;
  18. int f[101][(1<<14)+10],n,m,k,id[101];
  19. int head[maxn],tot,cnt[(1<<14)+10];
  20. struct edge{int to,nxt,w;}e[maxn<<5];
  21. void add(int u,int v,int w) {e[++tot]=(edge){v,head[u],w},head[u]=tot;}
  22. void ins(int u,int v,int w) {add(u,v,w),add(v,u,w);}
  23. int main() {
  24. read(n),read(m),read(k);
  25. for(int i=1,x;i<=k;i++) read(x),id[x]=i;
  26. for(int i=1,x,y,z;i<=m;i++) read(x),read(y),read(z),ins(x,y,z);
  27. for(int i=1;i<1<<k;i++) cnt[i]=__builtin_popcount(i);
  28. queue<pair<int,int > > q;
  29. q.push(make_pair(1,0));f[1][0]=1;
  30. while(!q.empty()) {
  31. int now=q.front().first,s=q.front().second;q.pop();
  32. for(int i=head[now];i;i=e[i].nxt) {
  33. if(!f[now][s]) continue;
  34. if(e[i].w<cnt[s]) continue;
  35. if(!f[e[i].to][s]) f[e[i].to][s]=1,q.push(make_pair(e[i].to,s));
  36. if(id[now])
  37. if(!(s>>(id[now]-1)&1))
  38. if(e[i].w>cnt[s])
  39. if(!f[e[i].to][s|(1<<(id[now]-1))])
  40. f[e[i].to][s|(1<<(id[now]-1))]=1,q.push(make_pair(e[i].to,s|(1<<(id[now]-1))));
  41. }
  42. }
  43. int ans=0,t=id[1]?1<<(id[1]-1):0;
  44. for(int i=0;i<1<<k;i++)
  45. if(f[1][i]) ans=max(ans,cnt[i|t]);
  46. write(ans);
  47. return 0;
  48. }

[BZOJ3380] [USACO2004 Open]Cave Cows 1 洞穴里的牛之一的更多相关文章

  1. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  2. 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

    3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved ...

  3. Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

    3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 64  Solved ...

  4. bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四*

    bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四 题意: 平面直角坐标系有n个点,从(0,0)出发,从一个点上可以跳到所有与它横纵坐标距离都≤2的点上,求最少步数 ...

  5. bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二*

    bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 题意: RMQ问题.序列长度≤25000,问题数≤25000. 题解: 倍增. 代码: #include < ...

  6. P3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

    还是蛮简单的一道题,首先dfs一遍,在所有能到达放有干草的洞穴的所有路径中,找出路径上最小伐值的最大值,按这个值由小到大,再来一遍贪心就行了,能放就放,不能放拉倒(也可以理解为,不能放把最前一个删了) ...

  7. P3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四

    这个系列总算是做完了,这是我第一次高效率做完四道题,虽然中间有两道水题,但是第一和第四题还是蛮好的,但是只要能想到思路就很快能打完的. 像这道题,刚开始在想能不能用DP?但是苦于不知道怎么实施,后来又 ...

  8. P3382: [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三

    首先,我们先确定,最长的曼哈顿距离只可能为 x1+y2-(x2+y2) 和 x1-y1-(x2-y2) 所以我们只需要维护四个值, 分别代表 max(x+y) ; max(x-y) ; min(x+y ...

  9. P3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

    这题..思维上远没有上一题复杂,是一个裸的RMQ..利用倍增就可以解决了. var n,q,i,j,f,t,c:longint; a:array[..,..] of longint; function ...

随机推荐

  1. tpo-08 C1 submit a document for graduation

    第 1 段 1.Listen to a conversation between a student and a registrar. 请听一段学生和老师的对话. 第 2 段 1.Hi, I'd li ...

  2. Siki_Unity_2-10_数据结构与算法

    Unity 2-10 数据结构与算法 任务1-1:数据结构简介 数据结构:数据存储的结构,数据之间的关系 数据结构分类: 集合:同属于一个集合 线性结构:数据元素存在一对一的关系 树形结构:数据元素存 ...

  3. TW实习日记:第14天

    今天可以说是又忙又不忙了,忙是因为要赶bug,似乎总有种隐形的力量催着你交工,但实际上太多涉及后端接口的问题,所以又要等别人修改接口才能改bug,可以说真是十分蛋疼了. 改bug的最大心得就是:写好注 ...

  4. 175. Invert Binary Tree【LintCode by java】

    Description Invert a binary tree. Example 1 1 / \ / \ 2 3 => 3 2 / \ 4 4    解题:题目要求讲二叉树的左子树和右子树对调 ...

  5. 142. O(1) Check Power of 2【LintCode by java】

    Description Using O(1) time to check whether an integer n is a power of 2. Example For n=4, return t ...

  6. python数据文件读写

    CSV格式读写 Comma-Separated Values 有时也称为字符分隔值,因为分隔字符也可以不是逗号.以,分隔的文件叫csv,以\t分隔的叫tsv 需要注意的一点:分隔符 import cs ...

  7. #pragma pack(n)对齐格式

    #pragma pack(n)对齐格式 #pragma pack(n) 是预处理器用来指定对齐格式的指令,表示n对齐.当元素字节小于n时,要扩展到n:若元素字节大于n则占用其实际大小. struct ...

  8. NFS服务搭建使用

    需求:由于线上业务有一些数据存在了Redis数据库和mysql数据库中了,导致了数据较大迁移起来比较麻烦,所以准备搭建NFS来做WEB的共享磁盘,存储这些数据. 服务端搭建: 查看本机关于nfs的包 ...

  9. Mr. Frog’s Game(模拟连连看)

    Description One day, Mr. Frog is playing Link Game (Lian Lian Kan in Chinese). In this game, if you ...

  10. 将代码上传到GitHub

    网上看了很多资料,都是用的命令行,比较难看懂,自己摸索了一下怎么样在图形界面上操作.下面记录的只是简单的如何把本地仓库直接上传到服务器上. 在mac上下载个GitHub Mac客户端,安装好后运行,输 ...