MyDS 稀疏矩阵加法

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//稀疏矩阵加法,行优先,c=a+b,a和b都是nxm矩阵
int cmp(int a,int b,int c,int d){
    if(a>c)return 1;
    if(a==c&&b>d) return 1;
    return 0;
}
void add(int a[][3],int b[][3],int c[][3]){
    int n=a[0][1],m=a[0][2],pc=0,pb=1;
    for(int i=1;i<=a[0][0];i++){
        while(pb<=b[0][0]&&cmp(a[i][1],a[i][2],b[pb][1],b[pb][2])){
            c[++pc][0]=b[pb][0],c[pc][1]=b[pb][1],c[pc][2]=b[pb][2];
            pb++;
        }
        if(pb<=b[0][0]&&a[i][1]==b[pb][1]&&a[i][2]==b[pb][2]){
            c[++pc][0]=a[i][0]+b[pb][0];
            c[pc][1]=a[i][1],c[pc][2]=a[i][2];
            pb++;
        }
        else {
            c[++pc][0]=a[i][0];
            c[pc][1]=a[i][1],c[pc][2]=a[i][2];
        }
    }
    while(pb<=b[0][0]){
        c[++pc][0]=b[pb][0];
        c[pc][1]=b[pb][1],c[pc][2]=b[pb][2];
        pb++;
    }
    c[0][0]=pc;c[0][1]=n;c[0][2]=m;
}

int a[10005][3],b[10005][3],c[10005][3];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    a[0][0]=n,b[0][0]=m;
    a[0][1]=a[0][2]=b[0][1]=b[0][2]=100;
    for(int i=1;i<=n;i++){
        int sa,sb,sc;scanf("%d%d%d",&sa,&sb,&sc);
        a[i][0]=sa,a[i][1]=sb;a[i][2]=sc;
    }
    for(int i=1;i<=m;i++){
        int sa,sb,sc;scanf("%d%d%d",&sa,&sb,&sc);
        b[i][0]=sa,b[i][1]=sb;b[i][2]=sc;
    }
    add(a,b,c);
    printf("%d\n",c[0][0]);
    for(int i=1;i<=c[0][0];i++){
        printf("%d %d %d\n",c[i][0],c[i][1],c[i][2]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值