经过几个小时的奋战,AC~~~ ^_^
下面是用M的列优先表示,
Description
/************************************/
/*求转置矩阵*/
/*问题描述:已知一个稀疏矩阵的三元组表,*/
/*求该矩阵转置矩阵的三元组表*/
/************************************/
Sample Output
code:
//
author:essence_of_acmer;
// time:2011.8.7
// theme:trans_sparse_matrix
// 用M的列优先表示
#include < iostream >
using namespace std;
#define M 20
typedef struct node
{
int i,j;
int v;
} JD ;
int trans_Sparse_matrix(JD ma[],JD mb[]) // way 1:按照M的列序存储
{
if (ma[ 0 ].v == 0 )
return ( 0 );
int n = ma[ 0 ].j;
int t = ma[ 0 ].v;
mb[ 0 ].i = n;
mb[ 0 ].j = ma[ 0 ].i;
mb[ 0 ].v = t;
int k = 1 ;
for ( int col = 1 ;col <= n;col ++ )
for ( int p = 1 ;p <= t;p ++ )
if (ma[p].j == col)
{
mb[k].i = ma[p].j;
mb[k].j = ma[p].i;
mb[k].v = ma[p].v;
k ++ ;
}
return ( 1 );
}
int fast_transpos(JD ma[],JD mb[]) // way 2:快速转置
{ int n,col,p,k,t;
int num[M],cpot[M];
n = ma[ 0 ].j;
t = ma[ 0 ].v;
mb[ 0 ].i = n; mb[ 0 ].j = ma[ 0 ].i; mb[ 0 ].v = t;
if (t <= 0 )
return ( 0 );
for (col = 0 ;col <= n;col ++ )
num[col] = 0 ; // num[col]:表示矩阵M中第col列中非零元个数
for (p = 1 ;p <= t;p ++ ) // 优秀
{ k = ma[p].j;
num[k] ++ ; // 统计矩阵M中第col列中非零元个数
}
cpot[ 0 ] = 0 ; cpot[ 1 ] = 1 ;
for (col = 2 ;col <= n;col ++ )
cpot[col] = cpot[col - 1 ] + num[col - 1 ]; // 统计M中第col列第一个非零元在mb中位置
for (p = 1 ;p <= t;p ++ )
{ col = ma[p].j; // ma[]中第col列
k = cpot[col]; // 第col列第一个非零元在mb中位置
mb[k].i = ma[p].j;
mb[k].j = ma[p].i;
mb[k].v = ma[p].v;
cpot[col] ++ ; // 优秀 // 经典代码段
}
return ( 1 );
}
int main()
{
int a[ 6 ][ 7 ] = { 0 , 12 , 9 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 ,
- 3 , 0 , 0 , 0 , 0 , 14 , 0 ,
0 , 0 , 24 , 0 , 0 , 0 , 0 ,
0 , 18 , 0 , 0 , 0 , 0 , 0 ,
15 , 0 , 0 , - 7 , 0 , 0 , 0 };
JD ma[M],mb[M];
int k = 1 ;
for ( int i = 0 ;i < 6 ;i ++ ) // 初始化
for ( int j = 0 ;j < 7 ;j ++ )
if (a[i][j]) {ma[k].i = i + 1 ;ma[k].j = j + 1 ;ma[k].v = a[i][j];k ++ ;}
ma[ 0 ].i = 6 ;ma[ 0 ].j = 7 ;ma[ 0 ].v = k - 1 ;
// trans_Sparse_matrix(ma,mb); // way 1;
fast_transpos(ma,mb); // way 2;
for ( int i = 0 ;i < k;i ++ ) // 打印原始
cout << ma[i].i << " , " << ma[i].j << " , " << ma[i].v << endl;
cout << endl << endl;
for ( int i = 0 ;i < k;i ++ ) // 打印改变后的
cout << mb[i].i << " , " << mb[i].j << " , " << mb[i].v << endl;
return ( 0 );
}
// time:2011.8.7
// theme:trans_sparse_matrix
// 用M的列优先表示
#include < iostream >
using namespace std;
#define M 20
typedef struct node
{
int i,j;
int v;
} JD ;
int trans_Sparse_matrix(JD ma[],JD mb[]) // way 1:按照M的列序存储
{
if (ma[ 0 ].v == 0 )
return ( 0 );
int n = ma[ 0 ].j;
int t = ma[ 0 ].v;
mb[ 0 ].i = n;
mb[ 0 ].j = ma[ 0 ].i;
mb[ 0 ].v = t;
int k = 1 ;
for ( int col = 1 ;col <= n;col ++ )
for ( int p = 1 ;p <= t;p ++ )
if (ma[p].j == col)
{
mb[k].i = ma[p].j;
mb[k].j = ma[p].i;
mb[k].v = ma[p].v;
k ++ ;
}
return ( 1 );
}
int fast_transpos(JD ma[],JD mb[]) // way 2:快速转置
{ int n,col,p,k,t;
int num[M],cpot[M];
n = ma[ 0 ].j;
t = ma[ 0 ].v;
mb[ 0 ].i = n; mb[ 0 ].j = ma[ 0 ].i; mb[ 0 ].v = t;
if (t <= 0 )
return ( 0 );
for (col = 0 ;col <= n;col ++ )
num[col] = 0 ; // num[col]:表示矩阵M中第col列中非零元个数
for (p = 1 ;p <= t;p ++ ) // 优秀
{ k = ma[p].j;
num[k] ++ ; // 统计矩阵M中第col列中非零元个数
}
cpot[ 0 ] = 0 ; cpot[ 1 ] = 1 ;
for (col = 2 ;col <= n;col ++ )
cpot[col] = cpot[col - 1 ] + num[col - 1 ]; // 统计M中第col列第一个非零元在mb中位置
for (p = 1 ;p <= t;p ++ )
{ col = ma[p].j; // ma[]中第col列
k = cpot[col]; // 第col列第一个非零元在mb中位置
mb[k].i = ma[p].j;
mb[k].j = ma[p].i;
mb[k].v = ma[p].v;
cpot[col] ++ ; // 优秀 // 经典代码段
}
return ( 1 );
}
int main()
{
int a[ 6 ][ 7 ] = { 0 , 12 , 9 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 ,
- 3 , 0 , 0 , 0 , 0 , 14 , 0 ,
0 , 0 , 24 , 0 , 0 , 0 , 0 ,
0 , 18 , 0 , 0 , 0 , 0 , 0 ,
15 , 0 , 0 , - 7 , 0 , 0 , 0 };
JD ma[M],mb[M];
int k = 1 ;
for ( int i = 0 ;i < 6 ;i ++ ) // 初始化
for ( int j = 0 ;j < 7 ;j ++ )
if (a[i][j]) {ma[k].i = i + 1 ;ma[k].j = j + 1 ;ma[k].v = a[i][j];k ++ ;}
ma[ 0 ].i = 6 ;ma[ 0 ].j = 7 ;ma[ 0 ].v = k - 1 ;
// trans_Sparse_matrix(ma,mb); // way 1;
fast_transpos(ma,mb); // way 2;
for ( int i = 0 ;i < k;i ++ ) // 打印原始
cout << ma[i].i << " , " << ma[i].j << " , " << ma[i].v << endl;
cout << endl << endl;
for ( int i = 0 ;i < k;i ++ ) // 打印改变后的
cout << mb[i].i << " , " << mb[i].j << " , " << mb[i].v << endl;
return ( 0 );
}