POJ 3123

news/2025/1/19 15:28:20/

https://cn.vjudge.net/problem/POJ-3123

题意:

n 个城市,m 条路,给定八个点(也就是四对),使每队点连通且总权和最小。

分析:

dp[i][j] 表示 i 状态下以 j 为起点的最小总权和。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
#include <map>
typedef long long int ll;
const int MOD = (int)1e9 + 7;
const int INF = 99999999;
using namespace std;int n, m;
map<string, int> city;
int dp1[1 << 8][35];
int dp2[1 << 8];
int d[35][35];
int vis[35];bool check(int s)
{for (int i = 0; i < 4; i++){if (((s & 3) != 3) && ((s & 3) != 0))return false;s >>= 2;}return true;
}int main()
{while (~scanf("%d%d", &n, &m) && (n || m)){for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)d[i][j] = (i == j) ? 0 : INF;string s1, s2;int w;for (int i = 0; i < n; i++){cin >> s1;city[s1] = i;}for (int i = 0; i < m; i++){cin >> s1 >> s2 >> w;int u = city[s1];int v = city[s2];if (w < d[u][v])d[u][v] = d[v][u] = w;}// Floydfor (int k = 0; k < n; k++)for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)d[i][j] = min(d[i][j], d[i][k] + d[k][j]);for (int i = 0; i < 8; i++){cin >> s1;for (int j = 0; j < n; j++)dp1[1 << i][j] = d[j][city[s1]];}for (int i = 0; i < (1 << 8); i++){if (!(i & (i - 1)))continue;for (int j = 0; j < n; j++){dp1[i][j] = INF;for (int sub = (i - 1) & i; sub != 0; sub = (sub - 1) & i)dp1[i][j] = min(dp1[i][j], dp1[sub][j] + dp1[i - sub][j]);}memset(vis, 0, sizeof(vis));int min_w, min_i;for (int j = 0; j < n; j++){min_w = INF;for (int k = 0; k < n; k++){if (dp1[i][k] < min_w && !vis[k]){min_w = dp1[i][k];min_i = k;}}vis[min_i] = 1;for (int k = 0; k < n; k++)dp1[i][min_i] = min(dp1[i][min_i], dp1[i][k] + d[k][min_i]);}}for (int i = 0; i < (1 << 8); i++){dp2[i] = INF;for (int j = 0; j < n; j++)dp2[i] = min(dp2[i], dp1[i][j]);}for (int i = 0; i < (1 << 8); i++){if (check(i)){for (int j = i; j != 0; j = (j - 1) & i){if (check(j))dp2[i] = min(dp2[i], dp2[j] + dp2[i - j]);}}}printf("%d\n", dp2[(1 << 8) - 1]);}return 0;
}

http://www.ppmy.cn/news/846250.html

相关文章

Flutter:第三方常用库整理

前言 随着Flutter的不断学习&#xff0c;接触了不少第三方的库。因此打算进行简单的整理。 dio 简介 一个强大的Dart/FlutterHTTP客户端&#xff0c;支持全局配置&#xff0c; 拦截器、表单数据、请求取消、文件上传/下载、 超时和自定义适配器等。 官方地址 https://pub-w…

Redis_客户端命令和数据操作(3)

目录 切换数据库 键命令 数据结构 string类型 hash类型 list类型 set类型 zset类型 查看中文value 源码等资料获取方法 切换数据库 redis数据库没有名称&#xff0c;默认有16个&#xff0c;通过0-15来标识&#xff0c;连接redis默认选择第一个数据库&#xff0c;可以…

青龙傻妞onebot不能用,改用cqhttp+傻妞/qqbot

不知为何我的onebot突然用不了了&#xff0c;傻妞还正常&#xff0c;这就需要改用cqhttp了 下面介绍cqhttp登录不上的问题 一般来说cqhttp还是很好安装的随便一搜就很多&#xff0c;这里先讲一下QQ扫码登录不成功问题 原因是&#xff0c;tx检测qq登录有风险&#xff0c;网络…

ONEBOT开发板

ONEBOT开发板 制作传感器的新方式—搭积木式制作传感器 介绍 ONEBOT是小米生态链爱其科技推出的开源传感器创作平台&#xff0c;提供了机器人、物联网应用创作原型&#xff0c;让每个人都享受创造科技的乐趣。 为电子爱好者、DIY、创客、教育等提供了制作传感器的 新方式&a…

『Nonebot 插件编写教程』nonebot2处理消息的完整过程

文章目录 前言捕获消息处理消息Bot机器人参数Event事件参数 回复消息字符串与Message调用MessageSegment接口 前言 前面已经有不止一篇博客教大家如何搭建nonebot2环境了大家可以去专栏查看&#xff0c;这篇博客并不会再次带大家来搭建nonebot2环境&#xff0c;而是着手与插件的…

Ubuntu搭建zhenxunbot聊天机器人

GitHub - HibiKier/zhenxun_bot: 基于 Nonebot2 和 go-cqhttp 开发&#xff0c;以 postgresql 作为数据库&#xff0c;非常可爱的绪山真寻bot 1.安装python3.9 apt和手动编译源码选一个&#xff0c;记得装pip pip改清华源&#xff0c;apt改国内随便哪个源 2.apt安装下面这一…

[Nonebot2]chatgpt

前言 今天我要教大家的是 如何实现nonebot之Gpt接入 准备 1.获取开发者key 获取key的地址&#xff1a;这里你们自行了解&#xff0c;有些原因不能展示 如图所示&#xff0c;我已经创建好一个key了&#xff0c;大家也可以点击Create new secret key按钮来创建一个新的key&am…

青龙面板node-onebot 教程

青龙安装部署教程-------点击跳转 没服务器的先自行购买&#xff0c;腾讯云2H4G8M首年70–点击购买 QQ交流&#xff1a;1014549449 --------------点击跳转 node-onebot 使用教程 注、 先去安全中心把端口开下 1.不管你用什么端口你都要在安全组开放一下 lsof -i :80|grep -…