游记:第37届校赛

T7 悦跑圈!启动!

改完这个题我就睡觉

求在s1或s2闭合的最小环,所以我枚举了边,假设一条边的两头分别是u和v,我以为环就是dij跑出来的d[u]+d[v],虽然不会立刻原路返回起点,但是中间可能有重复路径,而环是不能有这种路径的,所以从一开始就错了。(不长记性,失恋三部曲忘了)

因为要找从s出发要回到s的最小环,路径一定是s->和s相连的某个点->和s相连的另一个点->s,如果记录和s相连的另一个点到s的路径为L1(单独的一条边),再找到在不经过L1的情况下(也就是不从入点出发,也就是从出点出发得到的最短路)从s出发到达【和s相连的另一个点】的最短路径,答案就是求和(的最小值)。

把【和s相连的某个点】记为出点集合,把【和s相连的另一个点】记为入点集合,我们只需要先分组再通过一些处理使得从s到其他所有点的最短路径一定是s->出点中的一个->……,最小的【d[入点之一]+这个入点和s之间的边长】即为所求。

分组方式是“二进制分组”,这并不是状态压缩里的那种枚举,因为我们不需要所有出点入点分组的情况,我们只需要保证任意两点都有不同组的机会。

至于“通过处理使得所有最短路从s出发后第一个经过的一定是一个出点”,可以对dij进行一下魔改,也就是提前把出点和它们的边权放进优先队列,我们拓展的起点不再是d[s]=0,而是最近的一个出点,跳过s,那些入点根本不会在第一轮进队列,也就不会被更新。

评测系统没开,代码正确性未知,先放在这里好了。

code

#include <bits/stdc++.h>using namespace std;typedef long long ll;
const int maxn = 1e6 + 2;int n, m, T, s1, s2;
ll d[maxn], ans = 1e9 + 15;
bool vis[maxn];inline int read()
{int x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-'){f = -1;}ch = getchar();}while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch^48);ch = getchar();}return x * f;
}struct node 
{int nxt, to, w;
}a[maxn<<1];
int head[maxn], len;void add(int x, int y, int w)
{a[++len].to = y; a[len].nxt = head[x]; a[len].w = w;head[x] = len;
}
int vec[maxn], cnt, ps, pt, s[maxn], t[maxn];
ll vd[maxn], sd[maxn], td[maxn];void dij(int op)
{memset(vis, 0, sizeof(vis));memset(d, 0x3f, sizeof(d));priority_queue<pair<int, int>, vector<pair<int,int> >, greater<pair<int, int> > > q;for(int i=1; i<=ps; i++){q.push(make_pair(sd[i], s[i])); d[s[i]] = sd[i];}vis[op] = 1;while(!q.empty()){int u = q.top().second; q.pop();if(vis[u]) continue;vis[u] = 1;for(int i=head[u]; i; i=a[i].nxt){int v = a[i].to, ds = a[i].w;if(vis[v]) continue;if(d[v] > d[u] + ds){d[v] = d[u] + ds;q.push(make_pair(d[v], v));}}}for(int i=1; i<=pt; i++){ans = min(ans, d[t[i]]+td[i]);}
}int main()
{n = read(); m = read(); T = read();s1 = read(); s2 = read();for(int i=1; i<=m; i++){int u = read(), v = read(), w = read();add(u, v, w); add(v, u, w);}//求以s1为起点的最小环for(int i=head[s1]; i; i=a[i].nxt){vec[++cnt] = a[i].to; vd[cnt] = a[i].w;}for(int i=1,j=1; j<=32; i<<=1,j++){ps = pt = 0;for(int k=1; k<=cnt; k++){if(k & i) s[++ps] = vec[k], sd[ps] = vd[k];else t[++pt] = vec[k], td[pt] = vd[k];}if(!ps || !pt) continue;//全都进同一组了的情况有吗?dij(s1);}//求以s2为起点的最小环for(int i=head[s2]; i; i=a[i].nxt){vec[++cnt] = a[i].to; vd[cnt] = a[i].w;}for(int i=1,j=1; j<=32; i<<=1,j++){ps = pt = 0;for(int k=1; k<=cnt; k++){if(k & i) s[++ps] = vec[k], sd[ps] = vd[k];else t[++pt] = vec[k], td[pt] = vd[k];}if(!ps || !pt) continue;dij(s2);}ans = T / ans;printf("%lld", ans);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828601.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zlibrary镜像网站,z-library中文入口(持续更新)

zlibrary,一个全球领先的数字图书馆,拥有超过1300万册电子书资源,供人下载。它跨越多个学科,从古典文学到现代科技,再到人文艺术,无所不包。ZLibrary的使命是促进教育平等,让每个人都能便捷地获取知识。zlibrary数字图书馆镜像网址 zlbrary最新官网地址:https://zh.z-l…

MacOS(Unix系统)炫酷完美终端配置

MacOS(Unix系统)炫酷完美终端配置 1 下载安装 iTerm2 1.1 iTerm2,没有上架到AppStore,只能通过下载zip包安装,这是下载地址: https://iterm2.com/downloads.html ,压缩包双击打开后,将解压后的App拖动到【应用程序】文件夹就完成了。1.2 打开iTerm2 配置如下图,iTerm2…

流程编排LiteFlow-业务代码解耦

LiteFlow真的是相见恨晚啊,之前做过的很多系统,都会用各种if else,switch这些来解决不同业务方提出的问题,有时候还要“切一个分支”来搞这些额外的事情,把代码搞得一团糟,毫无可读性而言。如何打破僵局?LiteFlow为解耦逻辑而生,为编排而生,在使用LiteFlow之后,你会发…

Linux中awk命令实现指定字段的第一个字母大写

001、[root@PC1 test]# ls a.txt [root@PC1 test]# cat a.txt ## 测试数据 abcd KHG DETT dre ssae rtE [root@PC1 test]# awk {$1 = toupper(substr($1, 1, 1)) substr($1,2); print $0} a.txt ## 此处借助awk的内置函数…

java学习11.7

继续学习spring的内容

高级语言程序设计第六次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13303 学号:092300125 姓名:张天荣#include<stdio.h>int P(int num){int i;for(i=2;i<=num/2;i++){if(num%i==0)return…

【Maple2023软件下载与安装教程】

1、安装包Maple 2023: 链接:https://pan.quark.cn/s/8141b75ee5b5 提取码:d6AZ Maple 2022: 链接:https://pan.quark.cn/s/c726906349f2 提取码:geCP Maple 2021: 链接:https://pan.quark.cn/s/a5f710946c9a 提取码:fGKB Maple 2020: 链接:https://pan.quark.cn/s/83fd1…

SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能

SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能@目录项目整体描述页面图简介:功能概括说明具体功能举例代码介绍首页index.html操作成功跳转hello.html首页跳转index.html代码方法1:读取指定的Excel方法2:读取上传的Excel里面的内容方法3:java单文件…

2024-2025-1 20242407《网络》第二周学习总结

2024-2025-1 20242407《网络》第二周学习总结 教材学习内容总结教材学习中的问题和解决过程 问题一:对于维吉尼亚密码的加密方式不是很理解 解决方法:通过询问AI基于AI的学习

WPF StatusBar控件 这一块也能放一些东西

WPF StatusBar控件 这一块也能放一些东西StatusBar控件一般在窗口的底部。用于显示有关应用程序当前状态的各种信息,如光标位置、字数、任务进度等。<Window x:Class="WpfApp14.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentati…

Multi-Scale and Detail-Enhanced Segment Anything-1-LMSA-轻量级多尺度适配器

代码 插图 均来自官方开放资源 用自适应的全局平均池化获得不同尺寸的大小(设置的值就是每层经过池化之后的大小) 再用上采样 让不同尺寸的特征图来到原始大小上 然后将它们和原特征图在深度方面叠加` import torch.nn as nn import torch import torch.nn.functional as F …

线性dp

线性dp 线性dp是一种很常见的dp分析方式,关系之间具有线性的关系,状态之间相互递推,之后求出最终状态,今天完成了两道dp的题目第一个问题看似是四维打表实际上使用线性的方式分析可以很快的求出结果没必要维护三维的空间 第二个问题要记录数列的个数,我们首先要知道几个递推关系…