1. 程式人生 > >三元組稀疏矩陣快速轉置

三元組稀疏矩陣快速轉置

稀疏矩陣是隻儲存非零元的行值、列值、元素值
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;
}