加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Bad Cowtractors.(POJ-2377)

发布时间:2020-12-13 20:42:11 所属栏目:PHP教程 来源:网络整理
导读:最大生成树,只需要变1下改变的部份就能够了。 尝试了1下应用并查集的kruskal算法,与prim相比各有益弊吧,还要根据数据特点适当选

最大生成树,只需要变1下改变值的部份就能够了。

尝试了1下应用并查集的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,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 ",sum); else printf("⑴ "); return 0; }


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读