# UVa .01208 - Oreon [**題目連結**](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3649) ```cpp= #include<bits/stdc++.h> #define pii pair<int,int> #define pll pair<long,long> #define ll long long using namespace std; struct edge { int u, v, w; }; bool cmp(edge a, edge b) { return a.w < b.w; } bool ANS(edge a, edge b) { if(a.w == b.w) { if(a.u == b.u) return a.v < b.v; else return a.u < b.u; } else return a.w < b.w; } int t, n, par[26]; vector<edge> g; vector<edge> ans; int read() { int num = 0; char c = 0; while(c != EOF && (c < '0' || c > '9')) c = getchar(); while(c == EOF) return -1; while(c >= '0' && c <= '9') { num = num * 10 + (c - '0'); c = getchar(); } return num; } int find(int x) { if(par[x] == x) return x; return par[x] = find(par[x]); //路徑壓縮 } void kruskal() { sort(g.begin(), g.end(), cmp); for(int i = 0 ; i < 26 ; i++) par[i] = i; for(int i = 0 ; i < g.size() ; i++) { int x = find(g[i].u), y = find(g[i].v); if(x != y) { par[x] = y; ans.push_back({g[i].u, g[i].v, g[i].w}); } } sort(ans.begin(), ans.end(), ANS); } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int Case = 1; t = read(); while(t--) { g.clear(); ans.clear(); memset(par,0,sizeof(par)); n = read(); for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < n ; j++) { int w = read(); if(w > 0 && i < j) g.push_back({i, j, w}); } } kruskal(); cout << "Case " << Case++ << ":\n"; for(edge &i : ans) cout << (char)(i.u + 'A') << "-" << (char)(i.v + 'A') << " " << i.w << "\n"; } return 0; } ```