数据结构实验之数组三:快速转置
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:
矩阵的快速转置,水。
#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 ****************************************************/