A
斐波那契数列
#include<bits/stdc++.h>
using namespace std;
double n, a, b = 1, c;
int main()
{
cin>>n;
while (n--)
{
c = a + b;
a = b, b = c;
}
printf("%.2lf", a);
return 0;
}
B
[并查集]
让所有点指向父节点,最后比较父节点相同就代表是否是亲戚
#include<bits/stdc++.h>
using namespace std;
int p[5010],n,m,c;
int find(int x)
{
if (x != p[x]) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m >> c;
for (int i = 1; i <= n; i++)p[i] = i;
while (m--)
{
int x, y;
cin >> x >> y;
p[find(x)] = find(y);
}
while (c--)
{
int a, b;
cin >> a >> b;
if (find(a) == find(b))puts("Yes");
else puts("No");
}
return 0;
}
C
[并查集]
先初始化每个人都有自己的信仰,加入信仰时吗,加入是a,b朋友信仰相同,那么让a成为b的父亲(父节点)
最后统计信仰是自己本身的,如果是那么rp++
#include<bits/stdc++.h>
using namespace std;
int n,m,p[50010],cnt=0;
int find(int x)
{
if(x!=p[x])p[x]=find(p[x]);
return p[x];
}
int main()
{
while (cin >> n >> m)
{
cnt++;
for (int i = 1; i <= n; i++)p[i] = i;//初始化
int zongjiao = 0;
if (n == 0 && m == 0)return 0;
while (m--)
{
int x, y;
cin >> x >> y;//合并子集
if (find(x) != find(y))
p[find(y)] = find(x);//把y集合指向父亲x
}
for (int i = 1; i <= n; i++)
if (p[i] == i)zongjiao++;
printf("Case %d: %d\n", cnt, zongjiao);
}
return 0;
}