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
原创粉丝点击