Vijos P1250最勇敢的机器人 dp 分组背包
来源:互联网 发布:阳明山周杰伦知乎 编辑:程序博客网 时间:2024/04/27 23:49
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int N =1010;struct node{int val;int cost;}s[N];int set[N];int dp[N];vector<int>g[N];bool flag[N];int temp[N];int find(int x){int r=x;while(r!=set[r])r=set[r];int temp;while(set[x]!=r){temp=set[x];set[x]=r;x=temp;}return r;}void insert(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy) set[fx]=fy;}int main(){int n,m,k;while(scanf("%d%d%d",&n,&m,&k)!=EOF){for(int i=1;i<=n;i++){scanf("%d%d",&s[i].val,&s[i].cost);set[i]=i;g[i].clear();}int r,c;while(k--){scanf("%d%d",&r,&c);insert(r,c);}memset(flag,false,sizeof(flag));int cnt=0;for(int i=1;i<=n;i++){int fx=find(set[i]);g[fx].push_back(i);if(flag[fx]==false) temp[cnt++]=fx;flag[fx]=true;}memset(dp,0,sizeof(dp));for(int i=0;i<cnt;i++){for(int j=m;j>=0;j--){for(int h=0;h<g[temp[i]].size();h++){int u=g[temp[i]][h];if(s[u].cost<=j){dp[j]=max(dp[j],dp[j-s[u].cost]+s[u].val);}}}}printf("%d\n",dp[m]);}return 0;}用并查集进行分组,然后分组背包。
0 0
- Vijos P1250最勇敢的机器人 dp 分组背包
- Vijos P1250 - 最勇敢的机器人
- Vijos P1250 最勇敢的机器人
- vijos 1250 最勇敢的机器人
- 最勇敢的机器人(Vijos-1250)
- vijos1250 最勇敢的机器人(并查集+分组背包)
- 最勇敢的机器人
- 【t064】最勇敢的机器人
- vijos1250 最勇敢的机器人
- [VIJOS1250]最勇敢的机器人
- Vijos 1249题:最聪明的机器人
- DP 分组背包
- 背包dp之分组背包
- hdu4003 树形dp+分组背包
- hdu4044 树形dp+分组背包
- hdu5148 树形dp,分组背包
- hdu4044GeoDefense 树形dp+分组背包
- DP--分组背包--HDU - 1712
- C语言中内存对齐规则讨论(struct)
- nand flash
- Acer 偶尔按下右方向键会改变屏幕亮度问题解决
- 促进网站排名提升的三大因素
- JSP加载JS文件不起作用的问题
- Vijos P1250最勇敢的机器人 dp 分组背包
- i++不是原子操作
- Chirp:用声音“传送”文件
- java容器总结
- C中的volatile用法
- linux下使用ioctl() 获取本机mac地址、ip地址等等
- Win7系统下Microsoft VS2008过期激活方法
- C#常用开源类库收集
- Linux之旅----硬件篇