POJ 1751
2015-07-15 20:22
429 查看
#include<stdio.h> #include<algorithm> using namespace std; const int M=5000000+10; const int N=10000+10; int f ; int x ,y ; int n,cnt; struct p { int u,v,w; }num[M]; bool cmp(p x,p y) { return x.w<y.w; } int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } int juli(int i,int j) { return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); } void kruskal() { int i,tot=0; for(i=0;i<cnt&&tot<n-1;i++) { int a=find(num[i].u); int b=find(num[i].v); if(a==b) continue; printf("%d %d\n",num[i].u,num[i].v); f[a]=b; tot--; } } int main() { int i,j,k,a,b; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d %d",&x[i],&y[i]); scanf("%d",&k); for(i=0;i<=n;i++) f[i]=i; for(i=0;i<k;i++) { scanf("%d%d",&a,&b); a=find(a); b=find(b); if(a!=b) f[a]=b; } cnt=0; for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { int a,b; a=find(i); b=find(j); if(a==b) continue; num[cnt].u=i; num[cnt].v=j; num[cnt++].w=juli(i,j); } } sort(num,num+cnt,cmp); kruskal(); return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析