最短路径 floyd最小环 洛谷2738 篱笆回路 网上题解
/* https://www.luogu.org/blog/quadnucyard/solution-p2738 */ #include <cstdio> #include <cstring> #define MAXN 210 using namespace std; int n,m,l[MAXN],g[MAXN][MAXN],dist[MAXN][MAXN];//n:点数,m:边数 l:每条边的长度,g:点的邻接矩阵 int connect[MAXN][MAXN]; //记录边i和边j的连接点编号,两条边的交点,相当于边的邻接矩阵 struct union_find_set { //超级简洁的并查集 //一个并查集结构体 面向对象的思想 将变量和函数封装起来。实现了并查集的初始化,找祖先和合并操作 int n,fa[MAXN]; void init(int N) { n=N; for (int i=1;i<=n;i++) fa[i]=i; } int getFather(int u) { while (u=fa[u]=fa[fa[u]],u!=fa[u]); return u; } bool set_union(int u,int v) { return (u=getFather(u))==(v=getFather(v)) ? false : fa[v]=u; } } ufs; inline int min(int a,int b) {//内联函数,为了加快调用次函数的速度 return a<b ? a : b; } int main() { scanf("%d",&m); //一开始默认有2m个点,后面进行合并 for (int i=0;i<m;i++) { int s,L,n1,n2,x; //标号,长度,一个端点连接的边的个数,另一个端点连接的边的个数, 临时变量 scanf("%d%d%d%d",&s,&L,&n1,&n2); l[s]=L;//在长度数组中记录当前边的长度 for (int i=0;i<n1;i++) { scanf("%d",&x); connect[s][x]=s*2-1; } for (int i=0;i<n2;i++) { scanf("%d",&x); connect[s][x]=s*2; } } //合并 int nid[MAXN]={};//将数组中的每个元素都赋值为0,{}中如果有数字,则从左至右依次为下表为0,1,2...数组元素的值 ufs.init(m*2); for (int i=1;i<=m;i++) { for (int j=1;j<=m;j++) { if (connect[i][j]) ufs.set_union(connect[i][j],connect[j][i]); } } //离散化 加边 //其实就是根据并查集,为每个顶点实际编号,并查集就起到了防止对同一个点重复编号。 for (int i=1;i<=2*m;i++) { int fa=ufs.getFather(i); //如果i的祖先已经有实际编号,则 i的实际编号与其祖先的实际编号相同,否则 n自加,即顺序往下编号 nid[i]= nid[fa] ? nid[fa] : nid[fa]=++n;//nid[i]= nid[fa]!=0 ? nid[fa] : nid[fa]=++n; } //建图 memset(dist,0x0f,sizeof(dist) );//dist数组赋最大值0x3f更好吧 memset(g,0x0f,sizeof(g) );//邻接矩阵赋最大值 for (int i=1;i<=m;i++) { int u=nid[i*2-1],v=nid[i*2]; g[u][v]=g[v][u]=dist[u][v]=dist[v][u]=l[i]; } //求解 int ans=1<<20;//不明白 这里应该是想赋值为一个最大值 for (int i=1;i<=n;i++) dist[i][i]=0;//前面已经清零,没必要 //floyd求最小环 for (int k=1;k<=n;k++) { //先更新ans for (int i=1;i<k;i++) { for (int j=i+1;j<k;j++) { ans=min(ans,dist[i][j]+g[j][k]+g[k][i]); } } //再求最短路 for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]); } } } printf("%d\n",ans); return 0; }
最短路径 floyd最小环 洛谷2738 篱笆回路 网上题解相关推荐
- 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...
- 洛谷P3336 [ZJOI2013]话旧 题解
洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...
- 洛谷P4683 [IOI2008] Type Printer 题解
洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...
- 洛谷P3647 [APIO2014] 连珠线 题解
洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...
- 洛谷P4170 [CQOI2007]涂色 题解
洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...
- 洛谷P1868 饥饿的奶牛 题解
洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...
- 洛谷P1462 通往奥格瑞玛的道路 题解
洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...
- 洛谷 P2015 二叉苹果树 题解
洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...
- 洛谷P3879 [TJOI2010] 阅读理解 题解
洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...
最新文章
- android 按钮换行_Android LinearLayout实现自动换行
- Building High Performance Websites (1) CDN
- vi 查看最顶部_5分钟带你进入 Vim 大门,让你喜欢 Vim
- win32汇编使用win32 api实现字符串拷贝
- 【PP】生产发货仓位决定
- python实现排序算法_python实现各种排序算法
- 专科学历事业单位工资计算机,事业单位人来告诉你:学历跟入编之后待遇关系有多大!很直接...
- 互联网晚报 | 3月24日 星期四 |​ ​国务院安委办:立即开展民航安全隐患排查;​新东方新公司经营范围含电竞赛事策划...
- 集群节点列表编辑程序
- CF1110D Jongmah
- 解决IE6、IE7、IE8、Firefox兼容的两种方案
- nettry 入站事件如何传递到下一个handler
- JAVA写的模拟收发器设备面板工作状态并输出图形界面
- CentOS 6 修改FTP默认端口号
- FAT32、exFAT、NTFS
- c语言输入坐标求距离,计算两个经纬度之间距离的C语言代码
- [AlwaysOn] 创建SQL Server高可用性组T-SQL语法:SEEDING_MODE参数
- 科目二需要注意的点(笔记包含图片讲解)
- LiteOS学习(一)任务
- 提高网站排名的5大因素