/*
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 篱笆回路 网上题解相关推荐

  1. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  2. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

  3. 洛谷P4683 [IOI2008] Type Printer 题解

    洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...

  4. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  5. 洛谷P4170 [CQOI2007]涂色 题解

    洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...

  6. 洛谷P1868 饥饿的奶牛 题解

    洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...

  7. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

  8. 洛谷 P2015 二叉苹果树 题解

    洛谷 P2015 二叉苹果树 题解 洛谷 P2015 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有NNN个结点(叶子点或者树枝分叉点),编号为1-NNN ...

  9. 洛谷P3879 [TJOI2010] 阅读理解 题解

    洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...

最新文章

  1. android 按钮换行_Android LinearLayout实现自动换行
  2. Building High Performance Websites (1) CDN
  3. vi 查看最顶部_5分钟带你进入 Vim 大门,让你喜欢 Vim
  4. win32汇编使用win32 api实现字符串拷贝
  5. 【PP】生产发货仓位决定
  6. python实现排序算法_python实现各种排序算法
  7. 专科学历事业单位工资计算机,事业单位人来告诉你:学历跟入编之后待遇关系有多大!很直接...
  8. 互联网晚报 | 3月24日 星期四 |​ ​国务院安委办:立即开展民航安全隐患排查;​新东方新公司经营范围含电竞赛事策划...
  9. 集群节点列表编辑程序
  10. CF1110D Jongmah
  11. 解决IE6、IE7、IE8、Firefox兼容的两种方案
  12. nettry 入站事件如何传递到下一个handler
  13. JAVA写的模拟收发器设备面板工作状态并输出图形界面
  14. CentOS 6 修改FTP默认端口号
  15. FAT32、exFAT、NTFS
  16. c语言输入坐标求距离,计算两个经纬度之间距离的C语言代码
  17. [AlwaysOn] 创建SQL Server高可用性组T-SQL语法:SEEDING_MODE参数
  18. 科目二需要注意的点(笔记包含图片讲解)
  19. LiteOS学习(一)任务
  20. 提高网站排名的5大因素

热门文章

  1. 自动化测试===【转】Robot Framework作者建议如何选择自动化测试框架
  2. 双语电子商城系统(含小程序) v5.0
  3. linux 查询文件大小
  4. VS Code 配置 Rust-Analyzer
  5. 自创文字小游戏《人类末日·丧尸危机》
  6. Delphi-UpperCase 函数
  7. LeetCode 力扣 56. 合并区间
  8. 数学建模_数学模型的分类数学建模十大算法
  9. Elasticsearch 开箱指南
  10. 计算机的历史发展和应用