数据结构_稀疏矩阵转置(trans_sparse_matrix)



经过几个小时的奋战,AC~~~    ^_^



数据结构_稀疏矩阵转置_方法一_用M的列优先表示(trans_sparse_matrix) - Essence - ACM_Of_Essence
 


下面是用M的列优先表示,

Description

/************************************/
/*求转置矩阵*/
/*问题描述:已知一个稀疏矩阵的三元组表,*/
/*求该矩阵转置矩阵的三元组表*/
/************************************/

Sample Output

数据结构_稀疏矩阵转置_方法一_用M的列优先表示(trans_sparse_matrix) - Essence - ACM_Of_Essence
 

 


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


数据结构_稀疏矩阵转置_方法一_用M的列优先表示(trans_sparse_matrix) - Essence - ACM_Of_Essence
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值