快速转置
#include <iostream>
#include <string.h>
using namespace std;
class num
{
public:
int x,y;
int e;
int row,col;
}a[100000],b[100000];
int sum[100000],deal[1000000];
int main()
{
int i,j,n,m,s,t,flag;
int flag2;
cin>>n>>m;
a[0].row=n; a[0].col=m;
flag=1;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=m-1;j++)
{
cin>>s;
if(s)
{
a[flag].x=i;
a[flag].y=j;
a[flag++].e=s;
}
}
}
b[0].row=m; b[0].col=n;
memset(sum,0,sizeof(sum));
for(i=1;i<=flag-1;i++)
{
sum[a[i].y]++;
}
deal[0]=1;
for(i=1;i<=m-1;i++)
{
deal[i]=deal[i-1]+sum[i-1];
}
for(i=1;i<=flag-1;i++)
{
flag2=deal[a[i].y];
b[flag2].x=a[i].y; b[flag2].y=a[i].x;
b[flag2].e=a[i].e;
deal[a[i].y]++;
}
int x=1;
for(i=0;i<=b[0].row-1;i++)
{
for(j=0;j<=b[0].col-1;j++)
{
if(i==b[x].x&&j==b[x].y)
{
cout<<b[x].e<<" ";
x++;
}else
{
cout<<"0 ";
}
}
cout<<endl;
}
return 0;
}
矩阵的相乘 (带行连接信息的三元组表为行逻辑链接的顺序表)
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class num
{
public:
int x,y;
int e;
int sum[10000],row,col,deal[10000];
}a[1000],b[1000],c[1000];
int sum[1000];
int main()
{
void build(num *ex,int n,int m);
int i,j,n,m,s,t,flag;
cout<<"请输入矩阵1"<<endl;
cin>>n>>m;
build(a,n,m);
cout<<"请输入矩阵2"<<endl;
cin>>n>>m;
build(b,n,m);
if(a[0].col!=b[0].row)
{
cout<<"您输入错误"<<endl;
exit(0);
}
c[0].row=a[0].row; c[0].col=b[0].col;
int fp,row,col,fp2;
flag=1;
for(i=0;i<=a[0].row-1;i++)
{
memset(sum,0,sizeof(sum));
if(i<a[0].row-1)
{
fp=(a[0].deal)[i+1];
}else
{
fp=(a[0].deal)[i]+1;
}
for(j=(a[0].deal)[i];j<fp;j++)
{
col=a[j].y;
if(col<b[0].row-1)
{
fp2=(b[0].deal)[col+1];
}else
{
fp2=(b[0].deal)[col]+1;
}
for(int x=(b[0].deal)[col];x<fp2;x++)
{
sum[b[x].y]+=a[j].e*b[x].e;
}
}
for(j=0;j<=b[0].col-1;j++)
{
if(sum[j])
{
c[flag].x=i; c[flag].y=j;
c[flag++].e=sum[j];
}
}
}
t=1;
for(i=0;i<=c[0].row-1;i++)
{
for(j=0;j<=c[0].col-1;j++)
{
if(c[t].x==i&&c[t].y==j)
{
cout<<c[t].e<<" ";
t++;
}else
{
cout<<"0 ";
}
}
cout<<endl;
}
return 0;
}
void build(num *ex,int n,int m)
{
ex[0].row=n; ex[0].col=m;
int flag=1,i,j,t,s;
for(i=0;i<=n-1;i++)
{
t=0;
for(j=0;j<=m-1;j++)
{
cin>>s;
if(s)
{
t++;
ex[flag].x=i; ex[flag].y=j;
ex[flag++].e=s;
}
}
ex[0].sum[i]=t;
}
ex[0].deal[0]=1;
for(i=1;i<=n-1;i++)
{
(ex[0].deal)[i]=(ex[0].deal)[i-1]+(ex[0].sum)[i-1];
}
}