https://loj.ac/problem/10072

针对无向图

因为Floyd是按照结点的顺序更新最短路的,所以我们在更新最短路之前先找到一个连接点k,当前的点k肯定不存在于已存在的最短路f[i][j]的路径上,因为我们还没用这个k去更新最短路,相当于 (i -> k -> j -> j到i的最短路 -> i)这样一个环就找到了,接下来我们要记录路径,用path[i][j]表示在最短路i到j的路径上j的前一个结点,所以我们在更新最短路时也要更新这个点,原来的最短路是i -> j,现在变成了 i -> k -> j,所以有per[i][j] = pre[k][j],因为要找最小环,所以不断更新找到环的权值,环更新一次,路径也要更新一次,路径更新时根据pre数组迭代一下就ok了

附上图片加深理解

 #include <bits/stdc++.h>
#define read read()
#define up(i,l,r) for(register int i = (l);i <= (r);i++)
#define down(i,l,r) for(register int i = (l);i >= (r);i--)
#define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
#define ll long long
using namespace std;
int read
{
int x = , f = ; char ch = getchar();
while(ch < || ch > ) {if(ch == '-')f = -; ch = getchar();}
while(ch >= && ch <=) {x = * x + ch - ;ch = getchar();}
return x * f;
}
void write(int x)
{
if(x < ) x = -x,putchar('-');
if(x > ) write(x/);
putchar(x% + );
}
//-------------------------------------------------
const int N = ,INF = 0xfffffff;//debug 1e9+7 -> 0xffffff//极大值要开大
int n,m;
int f[N][N],e[N][N],pre[N][N],path[N];
//f ,e
int min_ring,cnt;
void init()
{
up(i,,n)
up(j,,n)
{
f[i][j] = INF;
e[i][j] = INF;
pre[i][j] = i;//i -> j最短路径上j的前一个节点;
//初始化;
}
} void readdata()
{
n = read; m = read;
init();
up(i,,m)
{
int u = read,v = read, w = read;
f[u][v] = f[v][u] = e[u][v] = e[v][u] = min(w,f[u][v]);
//重边中取最小;
}
} void floyd()
{
min_ring = INF;
up(k,,n)
{
//求环
up(i,,k-)//k不在i->j上;//这里的k是与i,j相连的;
{
up(j,,i-) //无向图利用对称性//?
{
if(f[i][j] + e[i][k] + e[k][j] < min_ring)
{
min_ring = f[i][j] + e[i][k] + e[k][j];
cnt = ;
int tmp = pre[i][j];
while(tmp != i)
{
path[++cnt] = tmp;
tmp = pre[i][tmp];
}
path[++cnt] = i;
path[++cnt] = k;
path[++cnt] = j;
}
}
}
//------------------------
//求最短路;//这里的k是中转点(在i->j的最短路上)
up(i,,n)
up(j,,n)
{
if(f[i][k] + f[k][j] < f[i][j])
{
f[i][j] = f[i][k] + f[k][j];
//pre[i][j]表示i到j最短路径上j前面的一个点
//所以此时i到j的最短路径上j前一个点为k到j最短路径上j的前一个点
pre[i][j] = pre[k][j];
}
}
}
} void write_ans()
{
if(min_ring == INF) printf("No solution.\n");
else up(i,,cnt) write(path[i]),putchar(' ');
} int main()
{
freopen("input.txt","r",stdin);
readdata();
floyd();
write_ans();
return ;
}

#10072. 「一本通 3.2 例 1」Sightseeing Trip(floyd求最小环+路径)的更多相关文章

  1. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  2. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  3. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  4. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  5. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  6. 「一本通 1.3 例 5」weight]

    「一本通 1.3 例 5」weight 题面 给定原数列 \(a_1,a_2,a_n\) ,给定每个数的前缀和以及后缀和,并且打乱顺序. 给出一个集合 \(S\) 要求从集合 \(S\) 中找到合适的 ...

  7. 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

    题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...

  8. 「LOJ#10034」「一本通 2.1 例 2」图书管理 (map

    题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需 ...

  9. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

随机推荐

  1. 基于MNIST数据集使用TensorFlow训练一个没有隐含层的浅层神经网络

    基础 在参考①中我们详细介绍了没有隐含层的神经网络结构,该神经网络只有输入层和输出层,并且输入层和输出层是通过全连接方式进行连接的.具体结构如下: 我们用此网络结构基于MNIST数据集(参考②)进行训 ...

  2. 关于mariad&mysql部分

    不赘述安装部分 查看安装的mysql版本 连接数据库基本操作: 查看数据库有没有运行: 退出操作:两者的区别就在于有无分号 或者: 查看已经安装的数据库: 新增用户并且赋予权限操作 MariaDB [ ...

  3. 错误 CS0006 Metadata file 'E:\项目名称\xxxx.dll'

    错误 CS0006 Metadata file 'E:\桌面临时文件\Pos\xxxx.dll' 1.找到这个类库在当前类库右键发生 找到 应用程序-->把程序集名称改成提示错误 的名称 2.找 ...

  4. 转wave 文件解析

    转 1 WAVE 文件格式分析 WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的.每个WAVE文件的 ...

  5. SSH Secure Shell Client中文乱码的解决方法

    http://www.cnblogs.com/52linux/archive/2012/03/24/2415082.html 方案一:修改linux服务器的环境变量 使用linux,在用户根目录下有一 ...

  6. 利用SharpZipLib进行字符串的压缩和解压缩

    http://www.izhangheng.com/sharpziplib-string-compression-decompression/ 今天搞了一晚上压缩和解压缩问题,java压缩的字符串,用 ...

  7. UEditor (富文本编译器)

    下载网址:https://ueditor.baidu.com/website/download.html 开发文档:http://fex.baidu.com/ueditor/

  8. ETL讲解(很详细!!!)

    ETL讲解(很详细!!!) ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要 ...

  9. 200. Spring Boot JNDI:在Tomcat中怎么玩JNDI?

      [视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...

  10. C语言的基础输入输出

    首先来整理一下各个数据类型的输入输出格式: 1.char %c 2.int/short int %d 3.long int %ld 4.long long int %lld 5.float %f 6. ...