三元组顺序表表示的稀疏矩阵转置Ⅱ。设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
- using namespace std;
- #define int long long
- #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
- typedef pair
PII; - const int N=2e6+10;
- struct node
- {
- int m,n,num;
- vector
> k; //三元组 - }s,p;
- signed main()
- {
- ios;
- cin>>s.m>>s.n>>s.num;
- for (int i=0;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
- for (int i=0;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
- {
- int l=s.k[i].second;
- for (int j=0;j
- {
- if (p.k[j].second==l)
- cout<
" " <" "<" "< - }
- }
- 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;
- }