克鲁斯卡尔算法模板(并查集完美结合)
2013-04-04 22:47
381 查看
#include <iostream> #include <cstdio> #include <algorithm> #define N 10005 using namespace std; int f ,rank ; struct node { int x,y,val; }e ; bool operator<(node a , node b) { return a.val<b.val; } void init_set() { for(int i=0 ; i<=N ; i++) f[i]=i,rank[i]=0; } int find_set(int k) { /*if(k!=f[k]) f[k]=find_set(f[k]); return f[k];*/ return f[k]=k!=f[k]?find_set(f[k]):f[k]; } void union_set(int x , int y) { x=find_set(x); y=find_set(y); if(x==y) return ; else { if(rank[x]>rank[y]) f[y]=x; else if(rank[y]>rank[x]) f[x]=y; else rank[x]++,f[y]=x; } } int main() { //freopen("1.txt","r",stdin); int n,i,j,s; while(scanf("%d",&n)) { if(n==0) break; int a,b,c,d; for(i=0 ; i<n*(n-1)>>1 ; i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(d==1) c=0; e[i].x=a,e[i].y=b,e[i].val=c; } sort(e,e+(n*(n-1)>>1)); init_set(); for(s=j=0 ; j<n*(n-1)>>1 ; j++) { a=find_set(e[j].x); b=find_set(e[j].y); if(a!=b) { union_set(a,b); s+=e[j].val; } } printf("%d\n",s); } return 0; }
相关文章推荐
- grivdview 模板之dropdownlist完美结合
- grivdview 模板之dropdownlist完美结合 -终结版
- 最小生成树算法汇总 (普里姆 && 克鲁斯卡尔与并查集结合)
- 通过t4模板结合XML定义文件生成MVVM中的Model Entity Class 代码
- Windows 2003系统安全+IIS下Web与FTP的完美结合(上)
- XML和J2EE的完美结合
- 用VS 2015写C++代码:体验一下变参模板、完美转发和lambda
- VB.NET与C#的完美结合
- 并查集模板
- vb.net与FLASH的完美结合
- POJ 2524 宗教信仰 并查集 基础模板
- TabLayout和viewpager的完美结合
- 105.(并查集结合绝对值最小的01背包)选学霸
- 并查集模板
- 【模板】并查集
- jquery, json与ashx的完美结合
- 并查集模板
- 对模板新的理解 ----- 模板和虚函数结合使用的新发现
- 并查集模板
- 新型 Web 2.0 应用:XPage 与传统 Servlet 的完美结合