SDUT 3347 数据结构实验之数组三:快速转置

数据结构实验之数组三:快速转置

Time Limit: 1000MS Memory Limit: 65536KB

Problem Description

转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个n*m的矩阵,且T( i , j )=M( j , i )。显然,一个稀疏矩阵的转置仍然是稀疏矩阵。你的任务是对给定一个m*n的稀疏矩阵( m , n < = 10000 ),求该矩阵的转置矩阵并输出。矩阵M和转置后的矩阵T如下图示例所示。
   
   稀疏矩阵M                             稀疏矩阵T

SDUT 3347 数据结构实验之数组三:快速转置SDUT 3347 数据结构实验之数组三:快速转置

Input

连续输入多组数据,每组数据的第一行是三个整数mu, nu, tu(tu <= 50),分别表示稀疏矩阵的行数、列数和矩阵中非零元素的个数,随后tu行输入稀疏矩阵的非零元素所在的行、列值和非零元素的值,同一行数据之间用空格间隔。(矩阵以行序为主序)

Output

输出转置后的稀疏矩阵的三元组顺序表表示。

Example Input

3 5 5
1 2 14
1 5 -5
2 2 -7
3 1 36
3 4 28

Example Output

1 3 36
2 1 14
2 2 -7
4 3 28
5 1 -5

DQE:

 
矩阵的快速转置,水。
 
 #include <iostream>
 #include <cstdio>

 using namespace std;

 struct TS
 {
     ];
     int nu,mu,tu;
 };

 void zz(TS f,TS &z)
 {
     z.tu=f.tu;z.nu=f.mu;z.mu=f.nu;    //jscpy
     ]={},cpot[]={};
     int i;
     ;i<=f.tu;i++)
     {
         num[f.data[i].j]++;
     }
     cpot[]=;
     ;i<=z.nu;i++)
     {
         cpot[i]=cpot[i-]+num[i-];
     }
     ;i<=z.tu;i++)
     {
         int zi=f.data[i].j;
         int zn=cpot[zi];
         z.data[zn].e=f.data[i].e;
         z.data[zn].i=f.data[i].j;
         z.data[zn].j=f.data[i].i;
         cpot[zi]++;
     }
 }

 int main()
 {
     TS f,z;
     while(scanf("%d %d %d",&f.nu,&f.mu,&f.tu)!=EOF)
     {
         int i;
         ;i<=f.tu;i++)    //in
         {
             scanf("%d %d %d",&f.data[i].i,&f.data[i].j,&f.data[i].e);
         }

         zz(f,z);

         ;i<=z.tu;i++)    //out
         {
             printf("%d %d %d\n",z.data[i].i,z.data[i].j,z.data[i].e);
         }
     }
     ;
 }

 /***************************************************
 User name: ***
 Result: Accepted
 Take time: 0ms
 Take Memory: 464KB
 Submit time: 2016-10-12 16:19:44
 ****************************************************/
上一篇:SDUT 2772 数据结构实验之串一:KMP简单应用


下一篇:SDUT 3340 数据结构实验之二叉树一:树的同构