数据结构实验之数组三:快速转置
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
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:
矩阵的快速转置,水。
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 struct TS 7 { 8 struct{int i,j; int e;}data[10010]; //10000 9 int nu,mu,tu; 10 }; 11 12 void zz(TS f,TS &z) 13 { 14 z.tu=f.tu;z.nu=f.mu;z.mu=f.nu; //jscpy 15 int num[10010]={0},cpot[10010]={1}; 16 int i; 17 for(i=1;i<=f.tu;i++) 18 { 19 num[f.data[i].j]++; 20 } 21 cpot[1]=1; 22 for(i=2;i<=z.nu;i++) 23 { 24 cpot[i]=cpot[i-1]+num[i-1]; 25 } 26 for(i=1;i<=z.tu;i++) 27 { 28 int zi=f.data[i].j; 29 int zn=cpot[zi]; 30 z.data[zn].e=f.data[i].e; 31 z.data[zn].i=f.data[i].j; 32 z.data[zn].j=f.data[i].i; 33 cpot[zi]++; 34 } 35 } 36 37 int main() 38 { 39 TS f,z; 40 while(scanf("%d %d %d",&f.nu,&f.mu,&f.tu)!=EOF) 41 { 42 int i; 43 for(i=1;i<=f.tu;i++) //in 44 { 45 scanf("%d %d %d",&f.data[i].i,&f.data[i].j,&f.data[i].e); 46 } 47 48 zz(f,z); 49 50 for(i=1;i<=z.tu;i++) //out 51 { 52 printf("%d %d %d\n",z.data[i].i,z.data[i].j,z.data[i].e); 53 } 54 } 55 return 0; 56 } 57 58 /*************************************************** 59 User name: *** 60 Result: Accepted 61 Take time: 0ms 62 Take Memory: 464KB 63 Submit time: 2016-10-12 16:19:44 64 ****************************************************/
时间: 2024-10-12 16:06:16