博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
code1002 搭桥
阅读量:5055 次
发布时间:2019-06-12

本文共 1322 字,大约阅读时间需要 4 分钟。

最小生成树

每读入一个城市,把他与之前的所有城市做一次link()

link的内容:

1.如果两个城市直接相连,合并他们的集合(并查集)

2.如果两个城市可以搭桥,添加一条边来连接。如果不可以搭桥,什么也不做。

接着循环所有pa[],如果pa[i]==i,那么这是一个city。这样计算city数量

做kruskal,计算桥的数量和桥的总长度

 

代码:

#include
#include
#include
#define Size 5005using namespace std;int n,m;int city[Size][2]; int num=0;int dis=0,num_city=0,num_bridge=0;int pa[Size];void init(){ for(int i=1;i<=n*m;i++){pa[i]=i;}}int find(int x){ if(x!=pa[x])pa[x]=find(pa[x]); return pa[x];}bool query(int x,int y){ return find(x)==find(y);}void un(int x,int y){ if(query(x,y))return; pa[find(x)]=find(y);}struct E{ int a,b,w;}edge[100005];int cnt=0;int add(int a,int b,int w){ cnt++; edge[cnt].a=a; edge[cnt].b=b; edge[cnt].w=w;}void link(int a,int b){ int cx=abs(city[a][0]-city[b][0]); int cy=abs(city[a][1]-city[b][1]); if(cx<=1&&cy<=1){un(a,b); return;} if(cx>=2&&cy>=2)return; if(cx>=2)add(a,b,cx-1); else add(a,b,cy-1);}bool ff(E a,E b){ return a.w
>n>>m; init(); char cc; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>cc; if(cc=='#'){ num++; city[num][0]=i; city[num][1]=j; for(int k=1;k

 

转载于:https://www.cnblogs.com/FuTaimeng/p/5657104.html

你可能感兴趣的文章
ANT 打jar包
查看>>
【技术】HTML5 canvas --- clock(1)
查看>>
操作系统的发展与分类
查看>>
东方元鼎付淼:移动互联网创业门槛已降低
查看>>
C#访问MySQL数据库的方法
查看>>
数学图形(2.25)三维悬链线与悬链面
查看>>
aspxGridview 根据单元格值得不同,设置单元格字体的颜色(设置和读取值)
查看>>
JS获取QueryString(Jquery)
查看>>
C# 接口应用及意义
查看>>
C#System.Text.RegularExpressions.Regex使用(一) .
查看>>
ethereum(以太坊)(十一)--字节数组(二)
查看>>
url参数中有+、空格、=、%、&、#等特殊符号的问题解决
查看>>
解题:SPOJ 422 Transposing is Even More Fun
查看>>
k8s 笔记
查看>>
数组越界溢出
查看>>
08.21学习笔记
查看>>
二分查找
查看>>
网络爬虫基本原理
查看>>
jquery - (delegate的使用)
查看>>
PAT 1040. 有几个PAT
查看>>