ZOJ 3204 Connect them MST-Kruscal

这道题目麻烦在输出的时候需要按照字典序输出,不过写了 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;

}

 

你可能感兴趣的:(connect)