题面

迷路(lose)

题目描述

dolls意外得到了一张藏宝图,于是他踏上了寻找宝藏的道路。在走了许多许多步,回到同一个位置以后,dolls确定自己迷路了。dolls十分生气,他觉得自己这么英明圣武的人就算迷路,也要迷路在最小的环上。于是他想知道从每个点出发最小的环有多长。藏宝图可以抽象成一个n个点m条边的,边权全为正的无向图,现在你需要求得经过每个点的最小环长是多少。

输入格式

第一行两个数n,m,表示点数和边数。下面m行每行三个整数u,v,l表示点u和点v之间有一条长度为l的无向边。

输出格式

输出n个数,表示经过每个点的最小环长,若没有则输出-1。

数据范围

\(n \le 300, m \le 40000\)

解析

题目并没说不存在自环和重边,那么先把自环和重边统计进答案,去掉自环和重边后的答案一定是一个简单环

先考虑如何统计一个点的答案

设把除\(u\)以外的其他点都加入图后,\(i, j\)两点间的最短路为\(dis(i, j)\)枚举连向\(u\)的边\((u, v1)\)和\((u, v2)\),答案就是\(min \{ dis(v1, v2) + len(u, v1) + len(u, v2) \}\)

然而每次暴力重新跑\(Floyd\)铁定超时

不难发现统计不同两点的答案时,两图中共有的点很多

于是我们考虑对所有的点分治

\(solve(l, r)\)表示\([l, r]\)的点没在图中的情况,当\(l = r\)时可以统计该点的答案,否则递归地处理两半

处理\([l, mid]\)时把\([mid + 1, r]\)加入图中,处理\([mid + 1, r]\)时把\([l, mid]\)加入图中

这样每个点被加入\(O(\log n)\)次,加入一个点复杂度为\(O(n^2)\),总复杂度为\(O(n^3 \log n)\)

由于\(\log n\)不到\(10\),所以可以过这题

注意:3个0x3f3f3f3f3f3f3f3f相加会爆long long

代码

#include <cstdio>
#include <iostream>
#include <cstring>
#define MAXN 305typedef long long LL;
const LL INF = 0x0f0f0f0f0f0f0f0f;
LL dist[10][MAXN][MAXN], map[MAXN][MAXN], ans[MAXN];
int N, M;
char in_graph[MAXN];void add(LL[MAXN][MAXN], int);
void solve(int, int, int);
int main() {freopen("lose.in", "r", stdin);freopen("lose.out", "w", stdout);std::ios::sync_with_stdio(false);std::cin >> N >> M;memset(map, 0x0f, sizeof map);memset(dist, 0x0f, sizeof dist);memset(ans, 0x0f, sizeof ans);for (int i = 1; i <= M; ++i) {int x, y; LL z;std::cin >> x >> y >> z;if (x == y) ans[x] = std::min(ans[x], z);ans[x] = std::min(ans[x], map[x][y] + z);ans[y] = std::min(ans[y], map[x][y] + z);map[x][y] = std::min(map[x][y], z);map[y][x] = std::min(map[y][x], z);}for (int i = 1; i <= N; ++i) dist[0][i][i] = 0;solve(1, N, 0);for (int i = 1; i <= N; ++i) {if (ans[i] ^ INF) std::cout << ans[i];else std::cout << -1;if (i ^ N) std::cout << " ";}std::cout << std::endl;return 0;
}
void add(LL d[MAXN][MAXN], int id) {in_graph[id] = 1;for (int i = 1; i <= N; ++i) {if (!in_graph[i]) continue;for (int j = 1; j <= N; ++j) {if (!in_graph[j]) continue;d[id][i] = std::min(d[id][i], map[id][j] + d[j][i]);d[i][id] = d[id][i];}}for (int i = 1; i <= N; ++i) {if (!in_graph[i]) continue;for (int j = 1; j <= N; ++j) {if (!in_graph[j]) continue;d[i][j] = std::min(d[i][j], d[i][id] + d[id][j]);}}
}
void solve(int l, int r, int dep) {if (l == r) {for (int i = 1; i <= N; ++i)for (int j = i + 1; j <= N; ++j)ans[l] = std::min(ans[l], dist[dep][i][j] + map[l][i] + map[l][j]);return;}int mid = (l + r) >> 1;for (int i = 1; i <= N; ++i)for (int j = 1; j <= N; ++j)dist[dep + 1][i][j] = dist[dep][i][j];for (int i = mid + 1; i <= r; ++i) add(dist[dep + 1], i);solve(l, mid, dep + 1);for (int i = l; i <= r; ++i) in_graph[i] = 0;for (int i = 1; i <= N; ++i)for (int j = 1; j <= N; ++j)dist[dep + 1][i][j] = dist[dep][i][j];for (int i = l; i <= mid; ++i) add(dist[dep + 1], i);solve(mid + 1, r, dep + 1);for (int i = l; i <= r; ++i) in_graph[i] = 0;
}
//Rhein_E

转载于:https://www.cnblogs.com/Rhein-E/p/10467952.html

[THUWC2019]迷路(最小环)相关推荐

  1. hdu 1599 find the mincost route(找无向图最小环)(floyd求最小环)

    ps(我到今天才知道Floyd的核心思想是动态规划==) hdu 1599 find the mincost route(找无向图最小环) 注意!这里写成   #define data 0x3f3f3 ...

  2. 最小环算法求解(Dijkstra算法+Floyd算法)

    方法一: #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> ...

  3. poj1734(最小环+路径)

    最小环问题:指的是在一张图中找出一个环,使得这个环的各边的权值之和最小. 方法一:断边法: 1.断开环的一条边(Wij=inf) 2.用Dijstra算法求出i->j的最短路径 3.恢复这条边的 ...

  4. HDU1599(最小环)

    最小环问题:指的是在一张图中找出一个环,使得这个环的各边的权值之和最小. 方法一:断边法: 1.断开环的一条边(Wij=inf) 2.用Dijstra算法求出i->j的最短路径 3.恢复这条边的 ...

  5. 图论 + 数论 ---- CF1325E E. Ehab‘s REAL Number Theory Problem (约数个数 + 枚举 + bfs找最小环)[从图结构优化搜索]

    题目链接 题目大意: 给你nnn个数,每个数保证约数个数不超过777个.问你从中选出若 干个数的乘积是完全平方数,最少要选择多少个数?,不存在输出-1. 题目思路: 1.每个数约数不超过7个→\rig ...

  6. 【图论专题】图的存储与遍历(最小环、所有环的大小)

    整理的算法模板合集: ACM模板 目录 Part 8.1 图的存储与遍历 P2661 信息传递(最小环) P2921 Trick or Treat on the Farm(求所有环的大小) 题单链接: ...

  7. 为什么在重庆比北京更容易迷路?Nature子刊:大脑GPS系统呈蜂窝状,弯路多了就“变形”...

    郭一璞 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 为什么在北京.西安这种道路横平竖直的城市,你更容易分清方向,不容易迷路? 为什么到了重庆.青岛这种道路方向随心所欲的城市,你就晕了? ...

  8. 多源最短路径Floyd、Floyd求最小环【模板】

    Floyd算法:用来找出每对点之间的最短距离.图可以是无向图,也可以是有向图,边权可为正,也可以为负,唯一要求是不能有负环.  1.初始化:将Map[][]中的数据复制到Dist[][]中作为每对顶点 ...

  9. bzoj1297 [SCOI2009]迷路(矩阵优化)

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

最新文章

  1. 马斯克入选美国工程院院士,张宏江博士入选外籍院士
  2. 可微偏导数一定存在_【导数压轴题】“偏导数”与含参不等式
  3. python怎么让摄像头图像暂停然后在启动_双目摄像头测量距离
  4. java线程 教程_Java多线程系列教程
  5. web播放器(falsh,audio)
  6. 调用face++平台api进行人脸识别
  7. 2009年出现的计算机术语,2009年计算机一级考试真题及答案
  8. Node.js Web 开发框架大全《中间件篇》
  9. Android之TrafficStats实现流量实时监测
  10. 关于集成通用mapper的Mybatis代码生成器产生的model类注解
  11. Linux 监视文件、文件夹改动
  12. 入门Sysmac Studio,白菜妹子是这样做的。
  13. 查看Linux配置的NTP,查看linux安装ntp服务器配置
  14. 一元函数积分学基本计算例题
  15. JavaWeb之路02--请求与响应
  16. 使用pr给视频局部打马赛克
  17. 列联表分析基于R语言
  18. 2020 前端必看 20个最好的前端Web开发工具
  19. 高能手办团服务器维护了,《高能手办团》4月2日例行维护公告
  20. python 拉丁超立方抽样

热门文章

  1. 松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸!
  2. 湖北工程学院计算机专业录取分数线,2021湖北工程学院录取分数线_历年各专业分数线(2017-2020),各省投档线_一品高考网...
  3. 基于ThinkPHP日历
  4. 快来玩玩博主的原创虐心游戏
  5. 计算机配置管理模块mmc无法,SQL Server 2012配置管理器/MMC无法创建管理单元
  6. java有声小说如何开发_怎么才能做有声小说播音,有声书主播如何训练
  7. python翻页爬豆瓣影评_荐爬虫7_《隐秘的角落》豆瓣影评爬取及可视化分析
  8. 世上最天真无邪的幽默
  9. 迅雷共享账号 防止被挤掉
  10. 《世界因你不同》——如何对老板说“不”