水题系列1
想法:
一道非常简单的并查集,完完全全水题,但是也得需要一些并查集的基本理解
代码:
#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;
}
想法:
为每一个人分座位,使得在同一个考场的人都不认识,看起来像是并查集但是因为没有朋友的朋友就是朋友的设定,所以只需要找不为朋友的就行,一开始想的是不是可以用贪心来遍历一遍然后遇到没有认识的就添加,但是这种方法会遇到没有最优解的情况,所以用了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;
}