pku 1797利用kruskal算法的过程

View Code
/*

  Name: 利用kruskal算法的过程 

  Copyright: 

  Author: Try86

  Date: 18/04/12 20:58

  Description: 求所有从起点到终点的路径上的最小边权的最大值 

*/



#include <cstdio>

#include <cstdlib>

#include <iostream>



using namespace std;



const int N = 1005;

const int M = 1000005;



int p[N], n, m;

struct edge {

    int u;

    int v;

    int w;

}e[M];



int cmp(const void *a, const void *b) {

    return ((edge *)b)->w - ((edge *)a)->w;

}   



void init(int n) {

    for (int i=1; i<=n; ++i) p[i] = i;

    return ;

}



int find(int v) {

    if (p[v] != v) p[v] = find(p[v]);

    return p[v];

}



void join(edge e) {

    int x = find(e.u);

    int y = find(e.v);

    if (x != y) p[x] = y;

    return ;

}



int kruskal(int n, int m) {

    init (n);

    qsort(e, m, sizeof(edge), cmp);

    for (int i=0; i<m; ++i) {

        join(e[i]);

        if (find(1) == find(n)) return e[i].w;//起点跟终点在同一集合时,最后加入集合的边权就是所求 

    }

}



int main() {

    int t, tt = 0;

    scanf ("%d", &t);

    while (t--) {

        scanf ("%d%d", &n, &m);

        for (int i=0; i<m; ++i) scanf ("%d%d%d", &e[i].u, &e[i].v, &e[i].w);

        int ans = kruskal(n, m);

        printf ("Scenario #%d:\n%d\n\n", ++tt, ans);

    }

    return 0;

}

 

你可能感兴趣的:(pku)