• 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

    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
    ",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 ****************************************************/
  • 相关阅读:
    命令实现linux和客户端文件上传下载
    python--linux上如何执行shell命令
    Eureka系列(一)Eureka功能介绍
    Eureka系列(七) 服务下线Server端具体实现
    编译时多态 与 运行时多态
    静态绑定(前期绑定) 与 动态绑定(后期绑定)
    重载 与 重写
    热点检测、方法内联、动态反优化
    数据库日志
    单例模式
  • 原文地址:https://www.cnblogs.com/Leroscox/p/6032015.html
Copyright © 2020-2023  润新知