POJ 2377 - Bad Cowtractors(最小生成树)

来源:互联网 发布:奶酪陷阱知乎 编辑:程序博客网 时间:2024/06/13 20:42

题目:

http://poj.org/problem?id=2377

思路:

最小生成树+图是否联通的判断.

Kruskal:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int INF = 1e9;const int maxn = 20005;struct edge{    int u, v, cost;}eg[maxn];int V, E;int par[1005];bool cmp(edge a, edge b){    return a.cost > b.cost;}void init(int n){    for(int i = 0; i <= n; ++i) par[i] = i;}int find(int x){    if(par[x] == x) return x;    else {        return par[x] = find(par[x]);    }}void unite(int x, int y){    x = find(x);    y = find(y);    if(y < x) par[x] = y;    else if(y > x) par[y] = x;}bool same(int x, int y){    return find(x) == find(y);}int kruskal(){    sort(eg, eg + E, cmp);    init(V);    int ans = 0, tmp = 0;    for(int i = 0; i < E; ++i) {        edge e = eg[i];        if(!same(e.u, e.v)) {            unite(e.u, e.v);            ans += e.cost;            tmp++;        }    }    if(tmp < V-1) ans = -1;    return ans;}int main(){//freopen("in", "r", stdin);    while(~scanf("%d %d", &V, &E)) {        for(int i = 0; i < E; ++i) {            scanf("%d %d %d", &eg[i].u, &eg[i].v, &eg[i].cost);        }        printf("%d\n", kruskal());    }    return 0;}

Prim

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;const int INF =1e9;const int maxn = 1005;int n, m;int cost[maxn][maxn], d[maxn];bool used[maxn];int prim(){    memset(d, -1, sizeof(d));    memset(used, 0, sizeof(used));    d[1] = 0;    int ans = 0;    int t = 0;    while(1) {        int v = -1;        for(int i = 1; i <= n; ++i) {            if(!used[i] && (v == -1 || d[i] > d[v])) v = i;            if(d[v] == -1) v = -1;        }        if(v == -1) {            if(t < n) ans = -1;            break;        }        t++;        used[v] = 1;        ans += d[v];        for(int i = 1; i <= n; ++i) {                d[i] = max(d[i], cost[v][i]);        }    }    return ans;}int main(){//freopen("in", "r", stdin);    while(~scanf("%d %d", &n, &m)) {        memset(cost, -1, sizeof(cost));        while(m--) {            int a, b, c;            scanf("%d %d %d", &a, &b, &c);            cost[a][b] = max(c, cost[a][b]);            cost[b][a] = max(c, cost[b][a]);        }        printf("%d\n", prim());    }    return 0;}



0 0
原创粉丝点击