水题系列 5

水题系列1

PREV-54 合根植物

想法:

    一道非常简单的并查集,完完全全水题,但是也得需要一些并查集的基本理解

代码:

#include<iostream>
#include<map>
 using namespace std;
 map<int,int> mm;
 int book[10000100];
 int n,m,sum,x,y,num=0;
 int fun(int a)
 {
     if(book[a]!=a)
     {
         book[a]=fun(book[a]);
     }
     return book[a];
 }
 int main()
 {
     cin>>n>>m;
     while(sum--)
     {
         cin>>x>>y;
         int x1=fun(x);
         int y1=fun(y);
         book[x1]=book[y1];
     }
     for(int i=1;i<=n*m;i++)
     {
         int dd=fun(i);
         if(mm[dd]==0)
         {
             mm[dd]=1;
             num++;
         }
     }
     cout<<num<<endl;
     return 0;
 }

PREV-53 分考场

想法:

   为每一个人分座位,使得在同一个考场的人都不认识,看起来像是并查集但是因为没有朋友的朋友就是朋友的设定,所以只需要找不为朋友的就行,一开始想的是不是可以用贪心来遍历一遍然后遇到没有认识的就添加,但是这种方法会遇到没有最优解的情况,所以用了dfs,题目要求的范围大小才100,直接暴力就能过。

代码:

#include<iostream>
 using namespace std;
 int q,p,a,b,book[101][101]={0},dp[101][101]={0},sum=101;
 void dfs(int x,int num){
     if(num>=sum)return;
     if(x>a){
         sum=min(num,sum);
         return;
     }
     for(int i=1;i<=num;i++){
         int j=0;
         while(dp[i][j]&&!book[x][dp[i][j]]){
             j++;
         }
         if(dp[i][j]==0){
             dp[i][j]=x;
             dfs(x+1,num);
             dp[i][j]=0;
         }
     }
     dp[num+1][0]=x;
     dfs(x+1,num+1);
}
int main()
 {
     cin>>a>>b;
     while(b--)
     {
         cin>>q>>p;
         book[q][p]=1;
         book[p][q]=1;
     }
     dfs(1,1);
     cout<<sum<<endl;
     return 0;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值