三元组顺序表表示的稀疏矩阵转置Ⅱ

三元组顺序表表示的稀疏矩阵转置Ⅱ。设a和b为三元组顺序表变量,分别表示矩阵M和T。要求按照a中三元组的次序进行转置,并将转置后的三元组置入b中恰当的位置。

输入格式:
输入第1行为矩阵行数m、列数n及非零元素个数t。
按行优先顺序依次输入t行,每行3个数,分别表示非零元素的行标、列标和值。

输出格式:
按置入b中的顺序输出置入的位置下标,转置后的三元组行标、列标和值,数据之间用空格分隔,共t行。

输入样例:

3 4 3
0 1 -5
1 0 1
2 2 2

输出样例:

1 1 0 -5
0 0 1 1
2 2 2 2

代码一:手动模拟过程,不过比较慢

#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const int N=2e6+10;
struct node
{
    int m,n,num;
    vector <pair<PII,int>> k;  //三元组
}s,p;
signed main()
{
    ios;
    cin>>s.m>>s.n>>s.num;
    for (int i=0;i<s.num;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        s.k.push_back({{a,b},c});
    }
    p.m=s.n;
    p.n=s.m;
    p.num=s.num;
    int cnt=0;
    for (int j=0;j<s.m;j++)
    for (int i=0;i<s.num;i++)
    {
        if (s.k[i].first.second==j)
        {
            int a=s.k[i].first.second;
            int b=s.k[i].first.first;
            int c=s.k[i].second;
            p.k.push_back({{a,b},c});
        }
    }
    for (int i=0;i<s.num;i++)
    {
        int l=s.k[i].second;
        for (int j=0;j<s.num;j++)
        {
            if (p.k[j].second==l) 
            cout<<j<<" "<<p.k[j].first.first<<" "<<p.k[j].first.second<<" "<<p.k[j].second<<endl;
        }
    }
    return 0;
}

代码二:

#include <bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
priority_queue<int,vector<int>,greater<int>> ll;
priority_queue<int> rr;
typedef pair<int,int> PII;
const int N=2e6+10;
struct node
{
    int id1,id2;
    int x,y;
    int date;
}str[N];
bool cmp1(node a,node b)
{
    if (a.x!=b.x) return a.x<b.x;
    else return a.y<b.y;
}
bool cmp2(node a,node b)
{
    return a.id1<b.id1;
}
int n,m,t;
signed main()
{
    ios;
    cin>>n>>m>>t;
    for (int i=0;i<t;i++)
    {
        cin>>str[i].y>>str[i].x>>str[i].date;
        str[i].id1=i;
    }
    sort(str,str+t,cmp1);
    for (int i=0;i<t;i++) str[i].id2=i;
    sort(str,str+t,cmp2);
    for (int i=0;i<t;i++)
    {
        cout<<str[i].id2<<" "<<str[i].x<<" "<<str[i].y<<" "<<str[i].date<<endl;
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值