图论 2023.11.27

Kruskal定义不同的优先级

P3623 [APIO2008] 免费道路
给定一个无向图,其中一些边是0,其他边为1
两个不同的点之间都应该一条且仅由一条边连接
并保持刚好K条0,求是否有解决方案
n<=2e4,m<=1e5
Kruskal定义不同的优先级
思路:Kruskal先以1边优先,筛出必须要的0边
之后Kruskal先添加必须要的的0边,再以0边优先,把0边添加至k后,再添1边,最后还要检查图的连通性
 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int n, m, k, fa[N], tot, cnt;
struct edge {int u, v, w;
}e[N], ans[N];
bool cmp1(edge e1, edge e2) {return e1.w > e2.w;
}
bool cmp2(edge e1, edge e2) {return e1.w < e2.w;
}
int find(int x) {return x == fa[x] ? x:fa[x] = find(fa[x]);
}
void init() {cnt = tot = 0;for (int i = 1; i <= n; i++) fa[i] = i;
}
void check() {int tmp = find(1);for (int i = 2; i <= n; i++) {int f = find(i);if (f != tmp) {printf("no solution\n");exit(0);}tmp = f;}
}
int main()
{cin >> n >> m >> k;for (int i = 1; i <= m; i++)cin >> e[i].u >> e[i].v >> e[i].w;init();sort(e + 1, e + m + 1, cmp1);     //从大到小(1边优先)for (int i = 1; i <= m; i++) {int x = find(e[i].u);int y = find(e[i].v);if (x == y)  continue;fa[x] = y;if (e[i].w == 0) {tot++, e[i].w = -1;    //定为必须边,下次的Kruskal此边为最高优先级}}if (tot > k) {               //(1边优先)0边>k,0边优先时,0边依然>kprintf("no solution\n");return 0;}check();init(); sort(e + 1, e + m + 1, cmp2);for (int i = 1; i <= m; i++) {int f1 = find(e[i].u), f2 = find(e[i].v);if (f1 == f2) continue;if (e[i].w == 1 || tot < k) {fa[f1] = f2;if (e[i].w < 1) {tot++, e[i].w = 0;}ans[++cnt] = e[i];}}if (tot < k) {printf("no solution\n");return 0;}check();for (int i = 1; i <= cnt; i++) {printf("%d %d %d\n", ans[i].u, ans[i].v, ans[i].w);}return 0;
}

几何联通

P3958 [NOIP2017 提高组] 奶酪
给定一个它的高度为 h,它的长度和宽度我们可以认为是无限大的奶酪,有n个空洞坐标为(x,y,z)
统一半径为r,能否利用已有的空洞跑 到奶酪的上表面去
深度优先搜索,不需要回溯,进入和出来判断只需看z-r,z+r和0,h的比较
n<=1e3,h,r<=1e9
 

#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<math.h>
using namespace std;
const int N = 1e3 + 10;
int n;
double h, r;
int vis[N];
int ans;
struct cir {double x, y, z;bool operator <(const cir& c)const { //按从低到高return z < c.z;                           }
}a[N];
double dist(double x1, double y1, double z1, double x2, double y2, double z2){return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1));
}
void dfs(int now) {if (ans) return;if (a[now].z + r>= h) {ans = 1;return;}vis[now] = 1;for (int i = 1; i <= n; i++) {if (vis[i])  continue;if (dist(a[now].x, a[now].y, a[now].z, a[i].x, a[i].y, a[i].z) > 2 * r) continue;dfs(i);}
}
void solve() {memset(vis, 0, sizeof(vis));ans = 0;cin >> n >> h >> r;for (int i = 1; i <=n; i++) {cin >> a[i].x >> a[i].y >> a[i].z;}sort(a + 1, a + 1 + n);for (int i = 1; i <= n; i++) {if (a[i].z- r <= 0) {dfs(i);    //深搜}}if (!ans) {cout << "No" << '\n';}else {cout << "Yes" << '\n';}
}
int main()
{int t;cin >> t;while (t--)  solve();
}

二维联通

P2498[SDOI2012] 拯救小云公主
给定一个row行line列大小的矩阵,给定n个boss的位置,需要从左下角,到达右上角
找一条路径使到距离boss的最短距离最远,输出最远距离
n<=3000
思路:小数二分最远距离,boss点作为圆心, 参考奶酪
左边界或上边界通过这些洞和右边界或下边界联通时,问题无解
 

#include<iostream>
#include<cstring>
#include<math.h>
#include<queue>
using namespace std;
int dis[3001][3001];
int x[3001], y[3001];
int getdis(int x1, int y1, int x2, int y2) {return pow(x1 - x2, 2) + pow(y1 - y2, 2);
}
bool able(int d, double r) {return r * r * 4 > d;
}
int row, line, n;
queue<int>q;
bool vis[3001];
bool bfs(double r) {memset(vis, 0, sizeof(vis));while (!q.empty())q.pop();for (int i = 1; i <= n; i++) {if (row - y[i] < r||x[i]<r) {   // 左下角(row, 0)出发通过这些圆q.push(i), vis[i] = 1;}}while (!q.empty()) {int p = q.front();q.pop();if (y[p] < r|| line - x[p] < r) {      //右上角(0,line)通过这些圆return 0;}for (int i = 1; i <= n; i++)if (!vis[i] && able(dis[p][i], r)) {       vis[i] = 1, q.push(i);}}return 1;
}
int main() {cin >> n >> line >> row;line--; row--;for (int i = 1; i <= n; i++) {cin >> x[i] >> y[i];x[i]--;y[i]--;}for (int i = 1; i <= n; i++)for (int j = 1; j < i; j++)dis[i][j] = dis[j][i] = getdis(x[i], y[i], x[j], y[j]);double l = 0, r = min(row, line), mid;for (int i = 1; i <= 60; i++) {mid = (l + r) / 2;if (bfs(mid))l = mid;else r = mid;}printf("%.2lf\n", l);return 0;
}

视为T在S之间滑动,转换为拓扑图目标所有窗口匹配,即度数为0    (atcoder 329 E)

给定一个长度为n字符串S,长度为m的字符串T

将长度为n字符串全是#变成S,操作:用T替换S的部分区间

n<=2e5,m<=5

思路:视为T在S之间滑动,于是有n-m+1的窗口

转换为拓扑图:入度为每个窗口不匹配的数量,一旦为0完全匹配,边为该窗口不匹配的字符,编号为(窗口编号i相连字符编号i+j)

之后拓扑,ans倒序后得到操作的顺序,目标为所有窗口完全匹配因为(视为T在S之间滑动)

#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<map>#include<set>#include<queue>#include<cstring>#include<math.h>#include<map>#include<vector>#include<stack>#include<unordered_map>#include<unordered_set>#include<bitset>#include<array>using namespace std;#define endl '\n'#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)#define int long long#define int128 __int128_t#define ll long long#define ld long doubletypedef unsigned long long ull ;#define fr(i,l,r) for(int i=l;i<=r;i++)#define fer(i,x)   for(int i=e.head[x];i;i=e.next[i])#define ufr(i,n,z) for(int i = n;i >= z; i--)#define pb(x) push_back(x)#define all(a) a.begin(),a.end()#define fi first#define se secondtypedef pair<int,int> pr;const int N = 1e6+10;const int mod=998244353,inf=1e18;int n,m;int a[N];map<int,int>mp;void solve(){cin>>n>>m;string s,t;cin>>s>>t;vector<int>in(n+1,m);vector<vector<int>>e(n+1);            //边                        queue<int>q;for(int i=0;i<n-m+1;i++){for(int j=0;j<m;j++){if(s[i+j]==t[j]){in[i]--;if(in[i]==0){              //完全与t对应q.push(i);}}else{e[i+j].push_back(i);          }}}vector<int>ans;while(!q.empty()){int u=q.front();q.pop();ans.push_back(u);for(int i=0;i<m;i++){if(mp[u+i]){continue;}mp[u+i]=1;for(auto it:e[u+i]){in[it]--;if(in[it]==0){q.push(it);}}}}reverse(ans.begin(),ans.end());                //每一次操作位置if(ans.size()<n-m+1){cout<<"No"<<'\n';}else{cout<<"Yes"<<'\n';}}signed main(){ios;int t=1;//   cin>>t;while(t--) solve();return 0;}

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

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

相关文章

【NGINX--6】安全控制--1

1、基于 IP 地址的访问 根据客户端的 IP 地址控制访问。 使用 HTTP 或 stream 访问模块控制对受保护资源的访问&#xff1a; location /admin/ { deny 10.0.0.1; allow 10.0.0.0/20;allow 2001:0db8::/32; deny all; }给定的 location 代码块允许来自 10.0.0.0/20 中的任何 …

centos 查看磁盘分区的文件系统类型

1 lsblk -f 这个命令是查看系统可以识别出的所有分区的文件系统类型 # lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT vda └─vda1 ext4 8c02a225-e14c-44a9-a9d8-4b60c4b…

百面深度学习-自然语言处理

自然语言处理 神经机器翻译模型经历了哪些主要的结构变化&#xff1f;分别解决了哪些问题&#xff1f; 神经机器翻译&#xff08;Neural Machine Translation, NMT&#xff09;是一种使用深度学习技术来实现自动翻译的方法。自从提出以来&#xff0c;NMT模型经历了几个重要的…

#Js篇:Promise

定义 Promise是异步操作解决方案&#xff0c;为异步操作提供统一接口。 Promise英文意思是“承诺”&#xff0c;表示其他手段无法改变。 返回 所有异步任务都返回一个Promise实例。 Promise实例有一个then方法&#xff0c;用于指定下一步的回调函数。 状态 异步操作未完…

一个简易的URL爬虫程序(java)

该程序是一个简单的Java程序&#xff0c;用于从指定的URL中获取网页内容并保存到本地文件。通过URL类打开指定的URL链接&#xff0c;并使用openStream()方法获取输入流。然后使用Scanner类读取输入流中的内容&#xff0c;并使用PrintWriter类将读取到的内容写入到本地文件中。 …

HTTP协议发展

HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC) 每一代HTTP解决了什么问题&#xff1f; 下图说明了主要功能。 HTTP 1.0 于 1996 年最终确定并完整记录。对同一服务器的每个请求都需要单独的 TCP 连接。 HTTP 1.1 于 1997 年发布。TCP 连接可以保持打开状态…

php使用Session实现简单购物车功能

一个简单的商城购物车功能。它使用了PHP的会话(Session)来存储购物车数据&#xff0c;通过调用不同的函数来实现添加商品、移除商品、更新商品数量以及清空购物车的功能 session_start();// 初始化购物车 if (!isset($_SESSION[cart])) {$_SESSION[cart] array(); }// 添加商品…

openGauss学习笔记-132 openGauss 数据库运维-查看openGauss状态

文章目录 openGauss学习笔记-132 openGauss 数据库运维-查看openGauss状态132.1 背景信息132.2 前提条件132.3 操作步骤132.4 参数说明132.5 示例 openGauss学习笔记-132 openGauss 数据库运维-查看openGauss状态 132.1 背景信息 openGauss支持查看整个openGauss的状态&#…

如何在Linux系统安装Nginx并启动

Nginx的介绍 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。官网&#xff1a;nginx newsNginx的下载 前往…

docker基础学习笔记

文章目录 Docker简介Linux下安装DockerDocker常用命令Docker网络Docker存储docker-composedockerfile制作镜像私有仓库镜像导入导出参考 Docker简介 定义&#xff1a;Docker是一个开源的应用容器引擎优势&#xff1a; 一键部署&#xff0c;开箱即用&#xff1a;容器使用基于im…

Qt5.15.2静态编译 VS2017 with static OpenSSL

几年前编译过一次Qt静态库:VS2015编译Qt5.7.0生成支持XP的静态库,再次编译,毫无压力。 一.环境 系统:Windows 10 专业版 64位 编译器:visual studio 2017 第三方工具:perl,ruby和python python用最新的3.x.x版本也是可以的 这三个工具都需要添加到环境变量,安装时勾选…

057-第三代软件开发-文件监视器

第三代软件开发-文件监视器 文章目录 第三代软件开发-文件监视器项目介绍文件监视器实现原理关于 QFileSystemWatcher实现代码 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&…

在使用微信或者支付宝支付的时候,为什么微信支付或者支付宝支付的异步通知商户支付结果要进行验签?

在使用微信支付或支付宝支付等第三方支付平台时&#xff0c;异步通知是一种常见的机制&#xff0c;用于通知商户支付结果或交易状态的变化。验签&#xff08;Signature Verification&#xff09;是为了确保异步通知的安全性和完整性而进行的重要步骤。以下是为什么要进行验签的…

人工智能时代的内容写作

内容不再只是王道&#xff0c;正如俗话所说&#xff1a;它是一种流动的货币&#xff0c;推动了巨大的在线信息和影响力经济。 每个品牌都是一个故事&#xff0c;通过其服务和商品讲述自己。尽管如此&#xff0c;大多数客户还是会通过您的在线内容最了解您。 但随着我们进入人…

每日一题:LeetCode-LCR 143.子结构判断

每日一题系列&#xff08;day 05&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

汇编:关于栈的知识

1.入栈和出栈指令 2. SS与SP 3. 入栈与出栈 3.1 执行push ax ↑↑ 3.2 执行pop ax ↓↓ 3.3 栈顶超界的问题 4. 寄存器赋值 基于8086CPU编程时&#xff0c;可以将一段内存当作栈来使用。一个栈段最大可以设为64KB&#xff08;0-FFFFH&#xff09;。 1.入栈和出栈指令…

C语言——函数

导读 &#xff1a; 这篇文章主要讲解一下C语言函数的一些基本知识。 前言&#xff1a;函数的概念 C语言中的函数又常常被称为子程序&#xff0c;是用来完成某项特定的工作的一段代码。就像我们生活中的模块化建造技术&#xff0c;类比模块化建房子的过程&#xff1a;整个程序…

高校大学校园后勤移动报修系统 微信小程序uniapp+vue

本文主要是针对线下校园后勤移动报修传统管理方式中管理不便与效率低的缺点&#xff0c;将电子商务和计算机技术结合起来&#xff0c;开发出管理便捷&#xff0c;效率高的基于app的大学校园后勤移动报修app。该系统、操作简单、界面友好、易于管理和维护&#xff1b;而且对后勤…

3-Python与设计模式--简单工厂模式

2-Python与设计模式–简单工厂模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上&#xff0c; 有三类可以选择的上餐品&#xff1a; 汉堡等主餐、小食、饮料。当我们选择好自己需要的食物&#xff0c;支付完成后&#…

Python中类的定义和使用细讲

文章目录 前言一、定义类二、创建类的实例三、创建 _ _ init _ _() 方法四、创建类的成员并访问1. 创建实例方法并访问2. 创建数据成员并访问 五、访问限制 前言 在 Python 中&#xff0c;类表示具有相同属性和方法的对象的集合。在使用类时&#xff0c;需要先定义类&#xff0…