ssl2348-连接格点【图论,最小生成树,并查集】
2018-01-12 19:31
218 查看
题目
有一个M行N列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。输入
第一行输入两个正整数m和n。以下若干行每行四个正整数x1,y1,x2,y2,表示第x1行第y1列的点和第x2行第y2列的点已经有连线。输入保证|x1-x2|+|y1-y2|=1。
2 2
1 1 2 1
输出
输出使得连通所有点还需要的最小花费。3
题解
并查集(朋友说的,反正老师没讲,自己想),然后就是用lt[(i-1)*n+j]表示第i行第j个点的联通分量。然后连一下没连上的就好了。代码
#include<cstdio> using namespace std; int n,h,k,s,w,x,y,q,lt[1000001],m,x1,y1,x2,y2; int father(int x) { return x==lt[x]?x:lt[x]=father(lt[x]); //并查集 } int main() { //freopen("s.txt","r",stdin);//测试用 scanf("%d%d",&m,&n); for (int i=1;i<=n*m;i++) lt[i]=i; while (scanf("%d%d%d%d 4000 ",&x1,&y1,&x2,&y2)==4) { x=father((x1-1)*n+y1); y=father((x2-1)*n+y2); if (x!=y)//如果不是同一个点 { lt[y]=x;//联通两个点 } } for (int j=1;j<=n;j++)//竖连 for (int i=1;i<m;i++) { x=father((i-1)*n+j); y=father(i*n+j); if (x!=y)//如果不是同一个点 { lt[y]=x;//联通 s+=1;//加 } } for (int i=1;i<=m;i++)//横连 for (int j=1;j<n;j++) { x=father((i-1)*n+j); y=father((i-1)*n+j+1); if (x!=y)//如果不是同一个点 { lt[y]=x;//联通 s+=2;//加 } } printf("%d",s);//输出 }
相关文章推荐
- ssl1615-Frogger【图论,最小生成树,并查集】
- 最小生成树 tyvj 连接格点grid
- HPU图论专项(graph)【拓扑--二分图--最小生成树---树的直径---并查集--奇偶树---最小环---强联通】
- 图论-最小生成树-并查集-Kruskal
- 连接的管道-HDU - 5253-并查集最小生成树
- 数据结构 || 图论 || 并查集+最小生成树(kruskal)
- 最小生成树Kruskal算法与并查集及其优化
- [ACM_图论] Highways (变形说法的最小生成树)
- HOJ Tangled in Cables 图论 最小生成树 prim
- uva 10397 - Connect the Campus(最小生成树&并查集)
- 图论入门,Prim算法求最小生成树代价,HDOJ 1879 继续畅通工程
- 最小生成数(并查集)Kruskal算法
- 最小生成树(Kruskal算法)贪心算法 利用并查集
- hdu 1875 畅通工程再续(图论:最小生成树)
- java ssl https 连接详解 生成证书
- HDU 5253 连接的管道 【2015年百度之星程序设计大赛 - 初赛(2)之最小生成树】
- 数据结构 练习 22-并查集以及图的最小生成树
- 【kruscal】【最小生成树】【并查集扩展】bzoj3714 [PA2014]Kuglarz
- java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)
- HDOJ 5253 连接的管道(最小生成树--kruskul)