2022/1/19学习总结

刷并查集的题(4h)

我先学的二叉树再学的并查集,结果二叉树动弹不得,并查集快写完了

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(int x);
void merge(int i,int j);
int fa[200000];
int n,m;
int road[200000][3];
void fast(int left,int right);

int main()
{
    scanf("%d %d",&n,&m);
    int i,nx=n,t;
    for(i=1;i<=m;i++){
        scanf("%d %d %d",&road[i][0],&road[i][1],&road[i][2]);
        fa[i]=i;
    }
    if(n-1>m)
        printf("-1");
    else {
    fast(1,m);
    for(i=1;i<=m;i++)
    {
        if( find(road[i][0])!=find(road[i][1]) )
        {
            merge(road[i][0],road[i][1]);
            nx--;
        }
        if(nx==1)
        {
            t=road[i][2];
            printf("%d",t);
            break;
        }
    }
    if(nx>1)printf("-1");
    }
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else {
        fa[x]=find(fa[x]);
        return fa[x];
    }
}

void merge(int i,int j)
{
    fa[find(i)]=find(j);
}

void fast(int left,int right)
{
    int t,l=left,j=right,x=road[left][2];
    if(l>j)
        return ;
    while(l<j)
    {
        while(l<j&&road[j][2]>=x)j--;
        while(l<j&&road[l][2]<=x)l++;
        if(l<j)
        {
            t=road[l][2],road[l][2]=road[j][2],road[j][2]=t;
            t=road[l][1],road[l][1]=road[j][1],road[j][1]=t;
            t=road[l][0],road[l][0]=road[j][0],road[j][0]=t;
        }
    }
    x=road[left][2],road[left][2]=road[l][2],road[l][2]=x;
    x=road[left][1],road[left][1]=road[l][1],road[l][1]=x;
    x=road[left][0],road[left][0]=road[l][0],road[l][0]=x;
    fast(left,l-1);
    fast(l+1,right);

}

 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n,m,q;
int v[20000],w[20000],f[20000];
int fa[20000];
int find(int x);
void merge(int i,int j);
int max(int x,int y);

int main()
{
    scanf("%d %d %d",&n,&m,&q);
    int i,j;
    for(i=1;i<=n;i++)
    {
        scanf("%d %d",&v[i],&w[i]);
        fa[i]=i;
    }
    int x,y;
    for(i=1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        v[find(y)]=v[find(y)]+v[find(x)];
        w[find(y)]=w[find(y)]+w[find(x)];
        v[find(x)]=0;w[find(x)]=0;
        merge(x,y);
    }
    for(i=1;i<=n;i++)
    {
        for(j=q;j>=v[i];j--)
        {
            f[j]=max(f[j],f[j-v[i]]+w[i]);
        }
    }
    printf("%d",f[q]);
    return 0;
}

int find(int x)
{
    if(fa[x]==x)
        return x;
    else
    {
        fa[x]=find(fa[x]);
        return fa[x];
    }
}

void merge(int i,int j)
{
    fa[find(i)]=find(j);
}

int max(int x,int y)
{
    if(x>y)return x;
    else return y;
}

再战二叉树(5h)

二叉树这玩意真是,学个概念花了一天,把概念整明白又整了一天,把代码敲出来又是一天,三天过去了啊,还是动弹不得。我把二叉树建立出来了,完事先序,中序,后序遍历都试了一遍,然后准备去做题,好家伙,根本不知道怎么做。搞了老半天只搞出来了一道看起来最简单的,而且还没用上我好不容易敲出来的二叉树的几个遍历。折磨~

 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void dfs(int st,int fn,int ss,int nn);
char zhong[10];
char hou[10];
int n;
int kk=0;

int main()
{
    scanf("%s",zhong);
    scanf("%s",hou);
    n=strlen(hou);

    dfs(0,n-1,0,n-1);
    return 0;
}

void dfs(int st,int fn,int ss,int nn)
{
    if(st>fn)return ;
     printf("%c",hou[fn]);
     int p=ss;
     while(zhong[p]!=hou[fn])
        p++;
     dfs(st,p-ss+st-1,ss,p-1);
     dfs(p-ss+st,fn-1,p+1,nn);
}

总计9h

明日计划

二叉树二叉树二叉树!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值