最小生成树之kruskal
2015-12-26 16:29
239 查看
#include<cstdio>
struct type{int x,y,z;} node[100000],me;
int f[100000],n,m;
void sort(int l,int r)//快排
{
int x=l,y=r,k;
k=node[(l+r)/2].z;
do
{
for(;node[x].z<k;x++){};
for(;node[y].z>k;y--){};
if (x<=y)
{me=node[x];node[x]=node[y];node[y]=me;x++;y--;};
}while(x<y);
if (x<r) sort(x,r);
if (l<y) sort(l,y);
}
int find(int x)//并查集;
{
if (f[x]!=x){ f[x]=find(f[x]);};//找到x的祖先,把它直接附给f[x] ;
return f[x];//返回x的祖先;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].z);
sort(0,m-1);//按路程长短排序;
int x1,x2,y1,y2,j=0,z,b=0;
long long d=0;
for (int i=0;i<n;i++) f[i]=i;
while (b<n-1)//找到当前不相连的结点的,将其长度累加进d;
{
x1=find(node[j].x);x2=find(node[j].y);
if (x1!=x2) {f[x1]=x2;b++;d+=node[j].z; };
j++;
}
printf("%lld",d);
return 0;
}
struct type{int x,y,z;} node[100000],me;
int f[100000],n,m;
void sort(int l,int r)//快排
{
int x=l,y=r,k;
k=node[(l+r)/2].z;
do
{
for(;node[x].z<k;x++){};
for(;node[y].z>k;y--){};
if (x<=y)
{me=node[x];node[x]=node[y];node[y]=me;x++;y--;};
}while(x<y);
if (x<r) sort(x,r);
if (l<y) sort(l,y);
}
int find(int x)//并查集;
{
if (f[x]!=x){ f[x]=find(f[x]);};//找到x的祖先,把它直接附给f[x] ;
return f[x];//返回x的祖先;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].z);
sort(0,m-1);//按路程长短排序;
int x1,x2,y1,y2,j=0,z,b=0;
long long d=0;
for (int i=0;i<n;i++) f[i]=i;
while (b<n-1)//找到当前不相连的结点的,将其长度累加进d;
{
x1=find(node[j].x);x2=find(node[j].y);
if (x1!=x2) {f[x1]=x2;b++;d+=node[j].z; };
j++;
}
printf("%lld",d);
return 0;
}
相关文章推荐
- 1-5-10:与指定数字相同的数的个数
- xcode安装模拟器失败 (could not download and install iOS 7.1 simulator ,需要授权才能安装这些软件包)
- 使用spring-data-redis开发redis应用
- 如何把MFC工程XP样式切换成WIN7样式
- android随笔08——代码注册广播接收者
- 数制的认识
- 【原】Windows下常用命令
- 求输入数字的和以及均值 ---C++
- modbus rtu 工作流程分析
- modbus rtu 工作流程分析
- MongoDB相关操作符
- ubuntu su 密码
- 克隆虚拟机
- Android应用的内存抓取
- spring-data-redis源码分析以及代码漏洞
- on()、off()的妙用
- 任玉刚【Android开发艺术探索】读后笔记一
- Android adb 常用的几个命令...
- 内联,重载,缺省参数
- 【LVL1_5_c】【课后练习】【3】 求两个数组的对应元素之和。