这道题目麻烦在输出的时候需要按照字典序输出,不过写了 Compare 函数还是比较简单的
因为是裸的 Kruscal ,所以就直接上代码了~
Source Code :
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream> #include <cstring> #include <cmath> #include <stack> #include <string> #include <map> #include <set> #include <list> #include <queue> #include <vector> #include <algorithm> #define Max(a,b) (((a) > (b)) ? (a) : (b)) #define Min(a,b) (((a) < (b)) ? (a) : (b)) #define Abs(x) (((x) > 0) ? (x) : (-(x))) #define MOD 1000000007 #define pi acos(-1.0) using namespace std; typedef long long ll ; typedef unsigned long long ull ; typedef unsigned int uint ; typedef unsigned char uchar ; template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;} template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;} const double eps = 1e-8 ; const int N = 210 ; const int M = 1100011*2 ; const ll P = 10000000097ll ; const double MINN = -999999999.9; const int INF = 0x3f3f3f3f ; const int MAXN = 110 ; int root[MAXN]; struct Edge { int from,to; int w; } edge[MAXN * MAXN]; int tol; Edge ans[MAXN * MAXN]; int cnt; void addedge (int u, int v, int w) { edge[tol].from = u; edge[tol].to = v; edge[tol].w = w; ++tol; } bool cmp1 (Edge a, Edge b) { if(a.w != b.w) return a.w < b.w; else if (a.from != b.from) return a.from < b.from; else return a.to < b.to; } bool cmp2 (Edge a, Edge b) { if (a.from != b.from) return a.from < b.from; else return a.to < b.to; } int find (int x) { if (root[x] == -1) return x; return root[x] = find (root[x]); } void kruscal () { memset (root,-1,sizeof(root)); cnt = 0; //加入最小生成树的边 for (int k = 0; k < tol; ++k) { int u = edge[k].from; int v = edge[k].to; int t1 = find(u); int t2 = find(v); if(t1 != t2) { ans[cnt++] = edge[k]; root[t1] = t2; } } } int main () { int T; scanf("%d",&T); int n; while (T--) { scanf ("%d",&n); tol = 0; int w; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { scanf("%d",&w); if(j <= i || w == 0) continue; addedge(i, j, w); } } sort (edge, edge + tol, cmp1); kruscal (); if (cnt != n - 1) { printf("-1\n"); continue; } else { sort (ans, ans + cnt, cmp2); for (int i = 0; i < cnt - 1; ++i) { printf("%d %d ", ans[i].from, ans[i].to); } printf("%d %d\n", ans[cnt - 1].from, ans[cnt - 1].to); } } return 0; }
时间: 2024-11-12 11:48:34