三元组顺序表表示的稀疏矩阵转置Ⅱ。设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;
}