题目传送门:F - Find 4-cycle (atcoder.jp)

题意:

给定一个无向图,其包含了S、T两个独立点集(即S、T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的点之间的边)。

求图中包含的一个四元环,若存在则输出环中包含的顶点,否则输出-1。

思路:

首先,四元环只能是由两个S中的点和两个T中的点构成,记为a、b,u、v,且a、b与u、v都直接有边相连。

|S| 为 300000,|T| 为 3000。于是我们考虑枚举S中点,记为Si,再枚举与Si相连的两个不同的点,记为u、v,则我们仍需找到S中一个点(四元环的第四个点,记为Sj),要求其与u、v相连。

再用一个二维数组记录 与T中两点相连的S中的点,记为between [ u ] [ v ],当值为 0 或值为 i 时,将其值更新为 i ,继续遍历; 当值不等于 0 且 不等于 i 时,则between [ u ] [ v ] 即为 Sj。

复杂度:O( max( |S| ,|T|2 ) ).

 

代码参考:

#include <bits/stdc++.h>
#define LL long long
using namespace std; const int S = 300010, T = 3010; int s, t, m, between[T][T];
vector<int> g[S]; int main()
{
cin >> s >> t >> m;
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
} //枚举S中的点Si,再枚举与其相连的T中的两个不同点u,v
//若u,v能连到S中的不同于Si的某点,则这四个点构成四元环
for(int i = 1; i <= s; i++)
for(auto &u : g[i])
for(auto &v : g[i])
{
if(u == v) continue;
if(!between[u-s][v-s] || between[u-s][v-s] == i) between[u-s][v-s] = between[v-s][u-s] = i;
else {
cout << i << " " << u << " " << between[u-s][v-s] << " " << v << endl;
return 0;
}
} cout << -1 << endl; return 0;
}

AtCoder Beginner Contest 260 F - Find 4-cycle的更多相关文章

  1. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  2. AtCoder Beginner Contest 260 (D-E)

    AtCoder Beginner Contest 260 - AtCoder D - Draw Your Cards 题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小( ...

  3. AtCoder Beginner Contest 261 F // 树状数组

    题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...

  4. AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组

    题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...

  5. AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆

    传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...

  6. AtCoder Beginner Contest 247 F - Cards // dp + 并查集

    原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...

  7. AtCoder Beginner Contest 133 F Colorful Tree

    Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...

  8. AtCoder Beginner Contest 171-175 F

    171 F - Strivore 直接把初始字符当成隔板,统计的方案数会有重复 为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串 所以在隔板字母后插入的字符只有 ...

  9. AtCoder Beginner Contest 182 F

    F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...

随机推荐

  1. Spring Ioc源码分析系列--Ioc的基础知识准备

    Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...

  2. BottomNavigationView点击刷新问题

    BottomNavigationView点击刷新问题 问题: 项目中使用了BottomNavigationView作为底部导航栏. 点击item切换的时候发现会有闪烁现象出现. 原因: BottomN ...

  3. C++进阶实例2--员工分组

    C++进阶实例2--员工分组 1 #include<iostream> 2 #include<map> 3 #include<vector> 4 #include& ...

  4. Oracle中通过逗号分割字符串并转换成多行

    通过逗号对字符串字段进行分割,并返回多行,通过使用regexp_substr()函数实现. SQL示例: select regexp_substr(q.nums, '[^,]+', 1, rownum ...

  5. 基于 BaGet 搭建 Nuget 服务器

    1 前言 1.1 BaGet 介绍 BaGet 是一个轻量级的,开源的,跨平台的 Nuget 和 symbol 服务器. 1.2 环境介绍 操作系统:CentOS 7 使用 Docker 安装 2 安 ...

  6. hexo + typora 图片插入解决办法

    Typora 是一款知名的 Markdown 编辑器,简单好用,体验良好.使用 hexo 搭建好博客后,主要是用 Markdown 来编写博客,typora 便是我的首选编辑器.但直接使用 typor ...

  7. C++:接送旅客

    接送旅客 时间限制:1.00sec        内存限制:128MB 题目描述: 现在,你是一家酒店的员工,你需要帮助这家酒店的旅客运送行李离开酒店.现在,你送顶层开始往下移动,为了减少电梯移动的距 ...

  8. 这篇SpringCloud GateWay 详解,你用的到

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 背景 在微服务架构中,通常一个系统 ...

  9. 开发工具-Visual Studio / Visual Studio Code 官方下载地址

    更新记录 2022年6月10日 完善标题. Visual Studio官方下载地址 https://visualstudio.microsoft.com/ Visual Studio Code官方下载 ...

  10. 在.NET中计算文件的MD5值

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...