三元組稀疏矩陣快速轉置
阿新 • • 發佈:2019-01-10
稀疏矩陣是隻儲存非零元的行值、列值、元素值
data[0]來儲存矩陣的行數、列數、非零元個數
struct Position
{
int row;
int col;
int value;
};
struct List
{
Position data[MAX + 1];
};
void Quick_Transpose (List l, List &s)
{
int col_pos[l.data[0].col + 1] = {};//記錄每一列第一個非零元的位置
int col_num[l.data[0].col + 1] = {};//記錄每一列非零元個數
//陣列大小加1是為了對應自然行列值
//預設初始化,每個值都賦值為0,但是ACM平臺貌似是不能編譯過去,需要用迴圈賦值
col_pos[1] = 1;
s.data[0].row = l.data[0].col;
s.data[0].col = l.data[0].row;
s.data[0].value = l.data[0].value;
for (int i = 1; i <= l.data[0].value; i++)
{
col_num[l.data[i].col]++;
}
for (int i = 2 ; i <= l.data[0].col; i++)
{
col_pos[i] = col_pos[i - 1] + col_num[i - 1];
}
for (int i = 1; i <=l.data[0].value; i++)
{
int p = l.data[i].col;
int q = col_pos[p];
s.data[q].value = l.data[i].value;
s.data[q].row = l.data[i].col;
s.data [q].col = l.data[i].row;
col_pos[p] ++;
}
}
#include <iostream>
#include <string>
using namespace std;
const int MAX = 50;
struct Position
{
int row;
int col;
int value;
};
struct List
{
Position data[MAX + 1];
};
void Create (List &l, int m, int n, int t)
{
l.data[0].row = m;
l.data[0].col = n;
l.data[0].value = t;
for (int i = 1; i <= l.data[0].value; i++)
{
cin >> l.data[i].row >> l.data[i].col >> l.data[i].value;
}
}
void Quick_Transpose (List l, List &s)
{
int col_pos[l.data[0].col + 1];//記錄每一列第一個非零元的位置
int col_num[l.data[0].col + 1];//記錄每一列非零元個數
for (int i = 0; i <= l.data[0].col; i++)
{
col_pos[i] = 0;
col_num[i] = 0;
}
//陣列大小加1是為了對應自然行列值
col_pos[1] = 1;
s.data[0].row = l.data[0].col;
s.data[0].col = l.data[0].row;
s.data[0].value = l.data[0].value;
for (int i = 1; i <= l.data[0].value; i++)
{
col_num[l.data[i].col]++;
}
for (int i = 2; i <= l.data[0].col; i++)
{
col_pos[i] = col_pos[i - 1] + col_num[i - 1];
}
for (int i = 1; i <=l.data[0].value; i++)
{
int p = l.data[i].col;
int q = col_pos[p];
s.data[q].value = l.data[i].value;
s.data[q].row = l.data[i].col;
s.data[q].col = l.data[i].row;
col_pos[p] ++;
}
}
void Print (List l)
{
int n = l.data[0].value;
for (int i = 1; i <= n; i++)
{
cout << l.data[i].row << " " << l.data[i].col << " " << l.data[i].value;
cout << endl;
}
}
int main()
{
int mu, nu, tu;
for (; cin >> mu >> nu >> tu; )
{
List l;
Create(l, mu, nu, tu);
List s;
Quick_Transpose(l, s);
Print(s);
}
return 0;
}