NC219675. 小凡出数据
描述
输入描述
第一行一个正整数表示测试组数。接下来组,每组第一行一个正整数表示树的结点数。接下来行每行个数表示结点到结点的最短路径长度,保证,且数据合法。
输出描述
对于每组输出行,每行三个整数。输出只需要满足题面所给条件即可。
示例1
输入:
2 3 0 1 2 1 0 3 2 3 0 6 0 3 4 8 5 4 3 0 7 5 2 1 4 7 0 12 9 8 8 5 12 0 7 6 5 2 9 7 0 3 4 1 8 6 3 0
输出:
1 2 1 1 3 2 1 2 3 2 6 1 5 2 2 3 1 4 2 4 5
说明:
C++(clang++11) 解法, 执行用时: 283ms, 内存消耗: 760K, 提交时间: 2021-03-20 22:19:11
#include<bits/stdc++.h> using namespace std; struct tt{ int x,y,val; }; tt p[100100]; int fa[1010]; bool cmp(tt a,tt b){ return a.val<b.val; } int find(int x){ if(fa[x]==x)return x; return fa[x]=find(fa[x]); } void init(int x){ for(int i=1;i<=x;i++){ fa[i]=i; } } int main(){ int t; scanf("%d",&t); while(t--){ int n,idx=1,x; scanf("%d",&n); init(n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&x); if(i<j){ p[idx].x=i,p[idx].y=j,p[idx].val=x; idx++; } } } sort(p+1,p+idx,cmp); for(int i=1;i<idx;i++){ int x=find(p[i].x); int y=find(p[i].y); if(x!=y){ printf("%d %d %d\n",p[i].x,p[i].y,p[i].val); fa[x]=y; } } } }