o2使我快乐
查看原帖
o2使我快乐
681403
todayfinish楼主2022/6/23 13:46
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=10050;

int father[maxn];


void init()   //初始化
{
    for(int i=1;i<maxn;i++)
     father[i]=i;   //自己为自己的父亲结点,根节点的特征
}

int find(int x)  //找祖宗
{
	return x==father[x]?x:father[x]=find(father[x]);
	/*如果father[x]=x 自己是自己的父亲,即为根节点,直接返回
	 否则,路径压缩,把x父辈的所有的结点(不止父亲)都变成根结点的儿子结点*/
}

void Union(int a,int b) //合并集合
{
	int fa=find(a);
	int fb=find(b);
	if(fa!=fb)
	 father[fa]=fb;
}

int main() 
{
	init();
    int n,m,w,ans=0;
    int price[maxn],value[maxn];  
	cin>>n>>m>>w;
	for(int i=1;i<=n;i++)
	{
		cin>>price[i]>>value[i];    //价格 价值
	} 
	
	int a,b;
	while(m--)
	{
		cin>>a>>b;  
		Union(a,b);
	}
	
	int dp[maxn];  //dp
	 
	for(int i=1;i<=n;i++)
	{
		if(i!=father[i]) /*不是根的话,把同一个集合的price和value累加到
		                   根的那个数组 */
		{
			price[find(i)]+=price[i];  //累加到根的那个数组
	    	value[find(i)]+=value[i];
		    price[i]=0;    //加过就更新为0,避免之后遍历到时再次加入 
		    value[i]=0;
		}
	}
	
	for(int i=1;i<=n;i++)   //01背包 放或不放
		for(int v=w;v>=price[i];v--)
           dp[v] = max(dp[v],dp[v-price[i]]+value[i]);
    
    cout<<dp[w];
	return 0;
}

真的烦

开o2 60分

不开

反而对了

这个故事告诉我们:

千万不要开o2

2022/6/23 13:46
加载中...