2022/1/19总结

早上记了单词

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值