早上记了单词
1.朋友
此题只有统计小明的朋友和小红的朋友有多少个,然后取他们两个之间最小的值再加1,因为包括小明和小红,我是通过根节点来统计小明和小红的朋友所以我要保证小明和小红的节点不变就可以
#include <iostream>
#include <algorithm>
using namespace std;
const int max_n=1e6+10;
int fna[max_n];
int fnv[max_n];
int cou1,cou2;
void init (int n,int flag)
{
for(int i=1;i<=n;i++)
if(!flag)
fna[i]=i;
else fnv[i]=i;
}
int find(int i,int flag)
{
if(!flag)
{
if(fna[i]==i)
return i;
else
{fna[i]=find(fna[i],flag);
return fna[i];
}
}
else
{
if(fnv[i]==i)
return i;
else
{fnv[i]=find(fnv[i],flag);
return fnv[i];
}
}
}
void unio(int i,int j,int flag)
{
if(!flag)
{
int fa_i=find(i,flag);
int fa_j=find(j,flag);
if(fa_i<fa_j)swap(fa_i,fa_j);//保证根节点1
fna[fa_i]=fa_j;
}
else
{
int fa_i=find(i,flag);
int fa_j=find(j,flag);
if(fa_i<fa_j)swap(fa_i,fa_j);
fnv[fa_i]=fa_j;
}
}
int main()
{
int n,m,p,q;
cin >> n >> m >> p >> q;
init(n,0);
init(m,1);
for(int i=1;i<=p;i++)
{
int x,y;
cin >> x >> y;
unio(x,y,0);
}
for(int i=1;i<=q;i++)
{
int x,y;
cin >> x >> y;
x=-x;
y=-y;
unio(x,y,1);
}
for(int i=2;i<=n;i++)
if(find(fna[i],0)==1)cou1++;//统计个数
for(int i=2;i<=m;i++)
if(find(fnv[i],1)==1)cou2++;
cout << min(cou1,cou2)+1;
}
2修复公路
该题因为我们求得是最短的时间里,所以我们按照时间排个序,然后再一一合并,只要所有的路都通了我们就暂停合并,输出时间
#include <iostream>
#include <algorithm>
using namespace std;
const int max_n=1e6+10;
struct node
{
int x,y,t;
}a[max_n];
int fa[max_n];
int n,m;
bool com(node x,node y)
{
return x.t < y.t;
}
void init(int n)
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
}
int find(int i)
{
if(fa[i]==i)
return i;
else
{
fa[i]=find(fa[i]);
return fa[i];
}
}
int pd()
{
for(int i=1;i<=n/2+1;i++)
if(find(i)!=find(n-i+1))return 0;
return 1;
}
int main()
{
cin >> n >> m;
init (n);
for(int i=1;i<=m;i++)
cin >> a[i].x >> a[i].y >> a[i].t;
sort (a+1,a+m+1,com);
int i;
for( i=1;i<=m;i++)
{
int fx=find(a[i].x);
int fy=find(a[i].y);
if(fx!=fy)
{
fa[fx]=fy;
if(pd())
break;
}
}
if(i<=m)
cout << a[i].t;
else cout << -1;
}
3中序遍历
只有当这个节点是单节点(就是没有兄弟节点)找出单节点就是求他们的组合数了,单节点要么在左,要么在右,只有两种选择,假设是n个节点就是2的n次
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string s,t;
cin >> s >> t;
int ans=1;
for(int i=0;i<s.length();i++)
for(int j=1;j<t.length();j++)
if(s[i]==t[j]&&s[i+1]==t[j-1])
ans*=2;
cout << ans;
}