[数据结构实验:稀疏矩阵]

加法,乘法,转置:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <string>
  5 #include <cmath>
  6 #include <algorithm>
  7 using namespace std;
  8 template<class T> struct Node {
  9         int x, y;
 10         T val;
 11         Node(int x, int y, T val): x(x), y(y), val(val) {}
 12         Node() {}
 13         bool operator < (const Node &_A) const {
 14                 return x < _A.x || x == _A.x && y < _A.y;
 15         }
 16         bool operator == (const Node &_A) const {
 17                 return x == _A.x && y == _A.y;
 18         }
 19         Node operator + (const Node &_A) {
 20                 return Node(x, y, val + _A.val);
 21         }
 22         void swapxy() {
 23                 swap(x, y);
 24         }
 25 };
 26 template<class T> struct Matrix {
 27         #define maxn 10
 28         Node<T> matrix[maxn];
 29         int total, n, m;
 30         void creat() {
 31                 puts("请输入稀疏矩阵中非零元素的个数:");
 32                 cin >> total;
 33                 puts("请输入矩阵的行数:");
 34                 cin >> n;
 35                 puts("请输入矩阵的列数:");
 36                 cin >> m;
 37                 for(int i = 0; i < total; i++) {
 38                         int x, y;
 39                         T val;
 40                         printf("请输入第%d个非零元素的(行标 列标 元素值):", i + 1);
 41                         cin >> x >> y >> val;
 42                         if(x > n || y > m) {
 43                                 puts("输入错误,请重新输入!");
 44                                 i--;
 45                                 continue;
 46                         }
 47                         matrix[i] = Node<T>(x, y, val);
 48                 }
 49                 sort(matrix, matrix + total);
 50         }
 51         Matrix operator + (const Matrix &_A) const {
 52                 Matrix<T> ans, tmp = *this;
 53                 ans.total = 0;
 54                 ans.n = n;
 55                 ans.m = m;
 56                 for(int i = 0; i < _A.total; i++) {
 57                         tmp.matrix[tmp.total++] = _A.matrix[i];
 58                 }
 59                 sort(tmp.matrix, tmp.matrix + tmp.total);
 60                 for(int i = 0; i < tmp.total; i++) {
 61                         if(tmp.matrix[i] == tmp.matrix[i + 1] && i < tmp.total - 1) tmp.matrix[i + 1] = tmp.matrix[i] + tmp.matrix[i + 1];
 62                         else ans.matrix[ans.total++] = tmp.matrix[i];
 63                 }
 64                 return ans;
 65         }
 66         Matrix operator * (const Matrix &_A) const {
 67                 Matrix<T> ans, tmp;
 68                 ans.total = 0;
 69                 ans.n = n;
 70                 ans.m = _A.m;
 71                 tmp.total = 0;
 72                 for(int i = 0; i < total; i++) {
 73                         for(int j = 0; j < _A.total; j++) {
 74                                 if(matrix[i].y == _A.matrix[j].x) tmp.matrix[tmp.total++] = Node<T>(matrix[i].x, _A.matrix[j].y, matrix[i].val * _A.matrix[j].val);
 75                         }
 76                 }
 77                 sort(tmp.matrix, tmp.matrix + tmp.total);
 78                 for(int i = 0; i < tmp.total; i++) {
 79                         if(tmp.matrix[i] == tmp.matrix[i + 1] && i < tmp.total - 1) tmp.matrix[i + 1] = tmp.matrix[i] + tmp.matrix[i + 1];
 80                         else ans.matrix[ans.total++] = tmp.matrix[i];
 81                 }
 82                 return ans;
 83         }
 84         void transpose() {
 85                 swap(n, m);
 86                 for(int i = 0; i < total; i++) {
 87                         swap(matrix[i].x, matrix[i].y);
 88                 }
 89         }
 90         void outp() {
 91                 puts("稀疏矩阵为:");
 92                 int p = 0;
 93                 for(int i = 1; i <= n; i++) {
 94                         for(int j = 1; j <= m; j++) {
 95                                 if(i == matrix[p].x && j == matrix[p].y && p < total) {
 96                                         cout << matrix[p].val << " ";
 97                                         p++;
 98                                 }
 99                                 else cout << "0 ";
100                         }
101                         cout << endl;
102                 }
103                 cout << endl;
104         }
105 };
106 int main()
107 {
108         Matrix<int> G, T, H, P;
109         cout << "-----------------A矩阵---------------\n";
110         G.creat();
111         G.outp();
112         cout << "-----------------B矩阵---------------\n";
113         T.creat();
114         T.outp();
115         H = G + T;
116         cout << "-----------------A + B --------------\n";
117         H.outp();
118         cout << "-----------------A + B 的结果转置-----\n";
119         H.transpose();
120         H.outp();
121         P = G * T;
122         cout << "-----------------A * B ----------------\n";
123         P.outp();
124         return 0;
125 }

时间: 2024-09-10 19:21:07

[数据结构实验:稀疏矩阵]的相关文章

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

数据结构实验之数组三:快速转置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个n*m的矩阵,且T( i , j )=M( j , i ).显然,一个稀疏矩阵的转置仍然是稀疏矩阵.你的任务是对给定一个m*n的稀疏矩阵( m

SDUT 3361 数据结构实验之图论四:迷宫探索

数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 30

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f

SDUT 2772 数据结构实验之串一:KMP简单应用

数据结构实验之串一:KMP简单应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两个字符串string1和string2,判断string2是否为string1的子串. Input 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格. Outp

SDUT 3311 数据结构实验之串三:KMP应用

数据结构实验之串三:KMP应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n.现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数? Input 首先输入一个整数n,代表有n个小朋友.下一行输入n个数,分别代表每个小朋友手里糖的数量. 之后再输

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

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含