Bad Cowtractors.(POJ-2377)

来源:互联网 发布:淘宝刷钻网站 编辑:程序博客网 时间:2024/05/15 07:22

最大生成树,只需要变一下改变值的部分就可以了。

尝试了一下运用并查集的kruskal算法,与prim相比各有利弊吧,还要根据数据特点适当选取。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<map>using namespace std;int n,m,a,b,c,par[1005],rankk[1005];struct edge {    int u,v,cost;    edge(int u=0,int v=0,int cost=0) : u(u),v(v),cost(cost) {}};bool cmp(const edge& e1,const edge& e2) {    return e1.cost>e2.cost;}edge es[20005];void init(int n) {    for(int i=1;i<=n;i++) {        par[i] = i;        rankk[i] = 0;    }}int findd(int x) {    return par[x] == x ? x : par[x] = findd(par[x]);}void unite(int x,int y) {    x = findd(x);    y = findd(y);    if(x==y) return ;    if(rankk[x] < rankk[y]) {        par[x] = y;    } else {        par[y] = x;        if(rankk[x] == rankk[y]) rankk[x] ++ ;    }}bool same(int x,int y) {    return findd(x) == findd(y);}int kruskal() {    sort(es,es+m,cmp);    init(n);    int res = 0;    for(int i=0;i<m;i++) {        edge e = edge(es[i].u,es[i].v,es[i].cost);        if(!same(e.u,e.v)) {            unite(e.u,e.v);            res += e.cost;        }    }    return res;}int main() {    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++) {        scanf("%d%d%d",&a,&b,&c);        es[i] = edge(a,b,c);    }    int sum = kruskal();    bool ok = true;    for(int i=1;i<=n;i++) {        for(int j=1;j<=n;j++) {            if(i!=j) if(!same(i,j)) {                ok = false; break;            }        }        if(!ok) break;    }    if(ok) printf("%d\n",sum);    else printf("-1\n");    return 0;}


0 0
原创粉丝点击