图论刷题记录

news/2025/10/21 20:51:54/文章来源:https://www.cnblogs.com/linjinkun/p/19156387
  • P8186 [USACO22FEB] Redistributing Gifts S

Floyd 传递闭包模板。

首先对于每只奶牛,先看它和那些比在它目前手中礼物要珍贵的礼物的主人能否交换,然后做一遍传递闭包,最后对于每只奶牛直接找排名最靠前并且能与自己原本手中礼物互换的礼物。

直接用 Floyd 是 \(O(n^3)\) 的,我用的是 bitset 优化,优化到了 \(O(\frac{n^3}{w})\)

代码:

#include<bits/stdc++.h>
using namespace std;
int a[505][505];
bitset<505>f[505];
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin >> n;for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){cin >> a[i][j];}}for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){f[i][a[i][j]] = 1;if(a[i][j] == i){break;}}}for(int j = 1;j<=n;j++){for(int i = 1;i<=n;i++){if(f[i][j]){f[i]|=f[j];}}}for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){if(f[i][a[i][j]]&&f[a[i][j]][i]){cout << a[i][j] << '\n';break;}}}return 0;
}
  • P9126 [USACO23FEB] Moo Route II S

SPFA……它没死!!!

首先很容易想到朴素的 SPFA,但是复杂度是 \(O(nm)\) 的。很容易想到 SPFA 被卡的地方就是每条边无法保证只被遍历 \(1\) 次,所以……如何让它只被遍历 \(1\) 次?首先,你要知道,不管你到 \(i\) 的时间有多早,你都是在同一时刻到达另一个 \(j\),很显然,只需将图中的所有点的联通的点按照它起飞的时间降序排序,那么对于后面再访问只需访问前面没法访问的进行尝试即可,你会发现这样每条边只会遍历一次,所以复杂度变成了 \(O(n+m)\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int vis[N];
int a[N];
int d[N];
int last[N];
struct node
{int x;int b;int e;
};
vector<node>e[N];
int q[N];
int cmp(node x,node y)
{return x.b>y.b;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,m;cin >> n >> m;for(int i = 1;i<=m;++i){int c,r,d,s;cin >> c >> r >> d >> s;e[c].push_back({d,r,s});}for(int i = 1;i<=n;++i){cin >> a[i];}a[1] = 0;for(int i = 1;i<=n;++i){sort(e[i].begin(),e[i].end(),cmp);}memset(d,0x3f,sizeof(d));int h = 1,t = 0;q[++t] = 1;d[1] = 0;vis[1] = 1;while(h<=t){int x = q[h];vis[x] = 0;++h;for(int _ = last[x];_<e[x].size();++_){int v = e[x][_].x,b = e[x][_].b,ee = e[x][_].e;if(b<d[x]+a[x]){break;}if(ee<d[v]){d[v] = ee;if(!vis[v]){vis[v] = 1;q[++t] = v;}}}}for(int i = 1;i<=n;++i){cout << (d[i] == d[0]?-1:d[i]) << '\n';}return 0;
}
  • P12026 [USACO25OPEN] Compatible Pairs S

一眼图论建模。

首先,当 \(d_i \le a\) 那么就可以让 \(i\)\(a-d_i\) 所在的编号连边,然后 \(b\) 也是同理,特判 \(a = b\) 的情况。然后建好边之后很显然发现这是一条可能有自环的链,最优做法就是从链的两端向里回流,很显然拓扑轻松搞定。

代码(要处理自环):

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
map<int,int>mp;
int w[N],d[N];
int chu[N];
int q[N];
vector<int>e[N];
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n,a,b;cin >> n >> a >> b;for(int i = 1;i<=n;++i){cin >> w[i] >> d[i];mp[d[i]] = i;}for(int i = 1;i<=n;++i){auto it = mp.find(a-d[i]);if(d[i]<=a&&it!=mp.end()){++chu[i];e[i].push_back(it->second);}if(a == b){continue;}it = mp.find(b-d[i]);if(d[i]<=b&&it!=mp.end()){++chu[i];e[i].push_back(it->second);}}int h = 1,t = 0;for(int i = 1;i<=n;i++){if(chu[i] == 1){q[++t] = i;	}}long long ans = 0;while(h<=t){int x = q[h];++h;for(int v:e[x]){if(v == x){ans+=w[v]>>1;w[v] = w[v]&1;}else if(w[v]){int cnt = min(w[x],w[v]);w[x]-=cnt;w[v]-=cnt;ans+=cnt;q[++t] = v;}}}cout << ans;return 0;
}
  • P12649 [KOI 2024 Round 2] 收集彩球

妙妙图论建模。

首先考虑将每个盒子上面的球的颜色向下面的球的颜色连一条有向边,然后会发现会形成若干个连通块,任意连通块互不影响,所以只看单个连通块如何处理,先判断无解,其实如果颜色中两个球都在各自盒子的上方的颜色数超过 \(1\),那么无解,显然是对的,因为挪动的情况只有空或者颜色相同,但很显然不可能颜色相同,空的话只能允许挪动一次,很明显要挪动的不止一次,所以无解。考虑如何算最小挪动次数,首先对于某个颜色,把这个颜色对应的两个球都拿上来,解放下面的球,花费 \(2\),然后将被解放的球挪动到与其颜色相同的球的上面,花费 \(cnt-1\),总共 \(2+(cnt-1) = cnt+1\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
vector<int>e[N];
int ru[N];
int cnt;
int num;
int vis[N];
void dfs(int x)
{for(int v:e[x]){if(!vis[v]){++cnt;num+=ru[v] == 0;vis[v] = 1;dfs(v);}}
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin >> n;for(int i = 1;i<=n;++i){int x,y;cin >> x >> y;e[x].push_back(y);e[y].push_back(x);++ru[y];}int ans = 0;for(int i = 1;i<=n;++i){if(!vis[i]){vis[i] = 1;cnt = 1;num = ru[i] == 0;dfs(i);if(num>1){cout << -1 << '\n';return 0;}if(cnt!=1){ans+=cnt+1;}}}cout << ans;return 0;
}

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

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

相关文章

「LG6596-How Many of Them」题解

题解记录P6596 How Many of Them sol 首先发现 \(n\) 特别小(事实上不如题中给出的这么小。。),于是考虑枚举割边数量。 这么做的一个重要根据是存在如下结论:对于一个 \(n\) 个点,已有 \(k\) 个联通块的图,记第…

骗我呢

\(\mathbf{Part. 1}\) 从右往左考虑肯定没啥前途,我们考虑从上往下扫行。对于每一行,它上面的元素肯定都是单调递增的,又知道元素的值域在 \(0\) 到 \(m\),而一行总共有 \(m\) 个数,因此每行可以被表示为 \(0\) 到…

手搓文件管理系统(持续开发中)

#include<bits/stdc++.h> using namespace std;/*** command:* cd [dirname]* to shift to a name_given dir* mkdir [dirname]* create a new dir under current dir* ls [dirname]* list…

AGC001~030 合集

AGC001~030。2025.3.10 - 2025.10.21。 如果附带了题目大意的话就是最近才做,或者是我过了几个月看不懂自己写的啥了重写了一遍。 如果您认为某些题目的理解不够到位,非常欢迎交流!!/kel,虽然应该也不会有人仔细看…

手写体识别

手写数字识别:基于PyTorch的卷积神经网络实现 一、项目概述 使用PyTorch实现一个基于卷积神经网络(CNN)的手写手写数字识别模型,通过MNIST数据集训练,实现对手写数字(0-9)的分类识别。 二、环境依赖Python 3.x PyTo…

AGC 合集 1.0

AGC001~030。2025.3.10 - 2025.10.21。 收录了前 30 场 AGC 中我写了题解的题目。 如果附带了题目大意的话就是最近才做,或者是我过了几个月看不懂自己写的啥了重写了一遍。 如果您认为某些题目的理解不够到位,非常欢…

20231302邱之钊密码系统设计实验一第二

1.参考相关内容,在Ubuntu或openEuler中(推荐openEuler)中使用OpenSSL库编程实现调用SM2(加密解密,签名验签),SM3(摘要计算,HMAC 计算),SM4(加密解密)算法,使用Markdown记录详细记录实践过程,每完成一项…

你好,我是肆闲:C语言的学习,成长与分享旅程

大家好,我是肆闲。 今天,我写下了我的第一篇博客,就像一个程序员运行了第一段 print("Hello World")一样。代码简单,却标志着一个充满无限可能的新世界,在我眼前打开了大门。作为一个刚入门的小白,我对…

深入BERT内核:用数学解密掩码语言模型的工作原理

传统语言模型有个天生缺陷——只能从左往右读,就像你现在读这段文字一样,一个词一个词往下看,完全不知道后面会出现什么。人类可不是这么学语言的。看到"被告被判**_**",大脑会根据上下文直接联想到&quo…

ZR 2025 NOIP 二十连测 Day 6

100 + 72 + 35 + 0 = 207, Rank 61/131.啊啊啊第一次上 200 /oh25noip二十连测day6 链接:link 题解:题目内 时间:4.5h (2025.10.21 13:40~18:10) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\)*1200估分:100 + 7…

20251021

上午工程实训课接触了电工基础,老师演示了万用表测量、简单电路连接和安全操作规范 下午英语课围绕旅游主题展开听力, 晚上写离散数学作业 间隙用碎片时间整理了课堂笔记,还讨论了实训课上的电路连接问题。 (工程实…

[论文笔记] Precision-Guided Context Sensitivity for Pointer Analysis

Introduction Context-sensitivity 会带来静态分析的精度提升,但是也会带来巨大的开销,这引出一个关键的问题:能否在某些对整体分析的精度有重要影响的函数上选择性的使用 context-sensitivity?这个问题的难点在于…

英语_备忘_疑难

好的,这里有一些关于 **How** 和 **What** 在感叹句中使用的例题,涵盖了常见的规则和易错点。 **规则回顾:*** **What + (a/an) + 形容词 + 名词*** **How + 形容词/副词 + (主谓)** --- **例题:** 请选择正…

朋友圈文案不会写?这个AI指令可能帮得上忙

最近在整理AI提示词的时候,顺手写了个朋友圈文案生成的指令。本来只是自己用,后来发现身边朋友也有这个需求,就想着分享出来。写在前面 刷朋友圈的时候,你有没有发现:有些人随便发个照片配几个字,点赞评论一大堆…

「JOISC2020-掃除」题解

题解记录掃除 (Sweeping) sol 从 Subtask 3 的特殊性质入手,可以发现一个关键性质:无论之后如何操作,这个单调性在任何时刻均满足。其原因可以简单考虑一下操作的效力范围与结果得到。 理解之后容易推广到全局,不难…

职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能

职责分离的艺术:剖析主从Reactor模型如何实现极致的并发性能Reactor单线程模型 在Reactor单线程模型中,所谓的“单线程”主要针对I/O操作而言,即所有的I/O操作(如accept()、read()、write()和connect())都在同一个…

数学题刷题记录(数学、数论、组合数学)

P5686 [CSP-S2019 江西] 和积和简单题,直接将区间求和转换成前缀和,设 \(A_i = \sum_{i = 1}^n a_i,B_i = \sum_{i = 1}^n b_i\),那么式子为: \[\sum_{l = 1}^n \sum_{r = l}^n (A_r-A_{l-1})(B_r-B_{l-1}) \]\[=\…

记录一次raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600)---惜分飞

记录一次raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600)---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:记录一次raid恢复之后数据库故障处理(ora-01200,ORA-26101,ORA-600) 作者:惜分飞…

CF简单构造小计

记录在这的都是感觉比较妙的或者看了题解的( CF2155D Batteries有 \(n\) 个元素,其中有 \(a\) 个是好的( \(a\) 未知)。 每次你可以询问一对元素,返回1当且仅当两个元素都是好的,否则返回0。 在 \(\lfloor\frac{…

软件工程第三次作业:四则运算题目生成器 - Nyanya-

四则运算题目生成器 - 结对项目报告项目信息 详情课程 软件工程作业要求 结对项目项目目标 实现一个四则运算题目生成器,支持有理数运算,规范软件开发流程,熟悉结对编程结对成员 姓名1: [杨浩] 学号1: [3123004462]…