当前位置:网站首页>AcWing 344. Solution to the problem of sightseeing tour (Floyd finding the minimum ring of undirected graph)
AcWing 344. Solution to the problem of sightseeing tour (Floyd finding the minimum ring of undirected graph)
2022-07-07 01:36:00 【Mr. Qiao Da】
AcWing 344. Sightseeing tour
Use this question floyd To find the minimum ring problem of undirected graphs , Pay attention to the sequence and significance of recording the path and finding the minimum intermediate point ( Because what is required is a ring , When you first find the ring , here k Not updated to i、j The shortest point between , So in path[cnt ++ ] = k And the next line get_min in path[cnt ++ ] = k Of k Values are different , It is guaranteed to be a ring )
#include<bits/stdc++.h>
using namespace std;
const int N = 110, INF = 0x3f3f3f3f;
int n, m;
int d[N][N], w[N][N]; //d Store the shortest path ,w Store edge weights
int path[N];
int pos[N][N];
int cnt;
void get_path(int i, int j){
if(pos[i][j] == 0) return ;
int k = pos[i][j];
get_path(i, k); // find i And the middle point k And save path Array
path[cnt ++ ] = k;
get_path(k, j); // find k and j And save path Array
}
signed main()
{
cin>>n>>m;
memset(w, 0x3f, sizeof w);
for(int i = 1; i <= n; i ++ ) w[i][i] = 0;
while(m -- ){
int a, b, c;
cin>>a>>b>>c;
w[a][b] = w[b][a] = min(w[a][b], c);
}
int res = INF;
memcpy(d, w, sizeof d);
for(int k = 1; k <= n; k ++ ){
// What is more puzzling here is why to seek the path first , Find the shortest distance between two points
// as a result of , here k Not updated to i、j The shortest point between
// So in path[cnt ++ ] = k And the next line get_min in path[cnt ++ ] = k Of k Values are different , It is guaranteed to be a ring
// Find the path first
for(int i = 1; i < k; i ++ ){
for(int j = i + 1; j < k; j ++ ){
if(res > (long long)d[i][j] + w[k][i] + w[j][k]){
// Find a smaller ring
res = d[i][j] + w[k][i] + w[j][k]; // Pay attention to the direction of the ring
cnt = 0; // Re record the path
path[cnt ++ ] = k; // This ring is from k set out
path[cnt ++ ] = i;
get_path(i, j);
path[cnt ++ ] = j;
}
}
}
// Find the middle point
for(int i = 1; i <= n; i ++ ){
for(int j = 1; j <= n; j ++ ){
if(d[i][j] > d[i][k] + d[k][j]){
d[i][j] = d[i][k] + d[k][j];
pos[i][j] = k;
}
}
}
}
if(res == INF) cout<<"No solution."<<endl;
else{
for(int i = 0; i < cnt; i ++ ) cout<<path[i]<<' ';
cout<<endl;
}
return 0;
}
边栏推荐
- Neon Optimization: summary of performance optimization experience
- 拖拽改变顺序
- What does security capability mean? What are the protection capabilities of different levels of ISO?
- LeetCode:1175. Prime permutation
- Drag to change order
- Today's question -2022/7/4 modify string reference type variables in lambda body
- Make Jar, Not War
- curl 命令
- 对C语言数组的再认识
- Dark horse notes - create immutable sets and streams
猜你喜欢

2022 Google CTF segfault Labyrinth WP

How to manage distributed teams?

一起看看matlab工具箱内部是如何实现BP神经网络的

字节P7专业级讲解:接口测试常用工具及测试方法,福利文

AcWing 345. 牛站 题解(floyd的性质、倍增)

Let's see through the network i/o model from beginning to end

HMM notes

Dark horse notes - create immutable sets and streams

AcWing 1148. 秘密的牛奶运输 题解(最小生成树)

1123. The nearest common ancestor of the deepest leaf node
随机推荐
C语言实例_4
安全保护能力是什么意思?等保不同级别保护能力分别是怎样?
免费白嫖的图床对比
What are the differences between Oracle Linux and CentOS?
2022 Google CTF SEGFAULT LABYRINTH wp
Taro 小程序开启wxml代码压缩
AcWing 1142. 繁忙的都市 题解(最小生成树)
从零开始匹配vim(0)——vimscript 简介
Go zero micro service practical series (IX. ultimate optimization of seckill performance)
LeetCode:1175. 质数排列
Machine learning: the difference between random gradient descent (SGD) and gradient descent (GD) and code implementation.
Failed to successfully launch or connect to a child MSBuild. exe process. Verify that the MSBuild. exe
Today's question -2022/7/4 modify string reference type variables in lambda body
grep查找进程时,忽略grep进程本身
Table table setting fillet
云呐|工单管理软件,工单管理软件APP
[signal and system]
ClickHouse字段分组聚合、按照任意时间段粒度查询SQL
Neon Optimization: performance optimization FAQ QA
Instructions for using the domain analysis tool bloodhound