题意

https://vjudge.net/problem/CodeForces-103B

很久很久以前的一天,一位美男子来到海边,海上狂风大作。美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼怪。

然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。 于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。 第一次射击的分析结果会反映在一张由n个点和m条边组成的无向图上。现在让我们来确定这张图 是不是可以被认为是章鱼怪。

为了简单起见,我们假设章鱼怪的形状是这样,他有一个球形的身体,然后有很多触须连接在他的身上。可以表现为一张无向图,在图中可以被认为由三棵或者更多的树(代表触须)组成,这些树的根在图中处在一个环中(这个环代表球形身体)。

题目保证,在图中没有重复的边,也没有自环

思路

法1:

按题意用dfs找无向图的环,若找到一个环且整个图是连通的,那么yes。

法2:

设环上有k个点,那么那些树除了根节点一共有n-k个点,而x个点的树有x-1条边,现在去掉了他们的根节点,所以有n-k条边,再加上环上有k条边,n-k+k = m。

所以可以直接判断图是否连通而且n==m。

代码

法1:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int n,m,in[N],vis[N],flag=0;
vector<int> g[N];
void dfs(int u,int fa)
{
in[u]=1;
for(int v:g[u])
{
if(!vis[v])
{
vis[v]=1;
dfs(v,u);
}
else if(v!=fa&&in[v])
{
// cout<<u<<" "<<v<<" gg"<<endl;
flag++;
}
}
in[u]=0;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(i,0);
cnt++;
}
}
// cout<<cnt<<" "<<flag<<endl;
if(cnt==1&&flag==1)
{
cout<<"FHTAGN!"<<endl;
}
else
cout<<"NO"<<endl;
return 0;
}

法2:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int n,m,vis[N],flag=0;
vector<int> g[N];
void dfs(int u)
{
for(int v:g[u])
{
if(!vis[v])
{
vis[v]=1;
dfs(v);
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(i);
cnt++;
}
}
if(cnt==1&&n==m)
{
cout<<"FHTAGN!"<<endl;
}
else
cout<<"NO"<<endl;
return 0;
}

  

#include<bits/stdc++.h>usingnamespacestd; #define inf 0x3f3f3f3f#define ll long longconstint N=200005; constint mod=1e9+7; constdouble eps=1e-8; constdouble PI = acos(-1.0); #define lowbit(x) (x&(-x))int n,m,in[N],vis[N],flag=0; vector<int> g[N]; void dfs(int u,int fa) { in[u]=1; for(int v:g[u]) { if(!vis[v]) { vis[v]=1; dfs(v,u); } elseif(v!=fa&&in[v]) { // cout<<u<<" "<<v<<" gg"<<endl; flag++; } } in[u]=0; } int main() { std::ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } int cnt=0; for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; dfs(i,0); cnt++; } } // cout<<cnt<<" "<<flag<<endl;if(cnt==1&&flag==1) { cout<<"FHTAGN!"<<endl; } elsecout<<"NO"<<endl; return0; }

CodeForces - 103B(思维+dfs找环)的更多相关文章

  1. # 「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程)

    「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环 ...

  2. Codeforces Round #369 (Div. 2) D. Directed Roads —— DFS找环 + 快速幂

    题目链接:http://codeforces.com/problemset/problem/711/D D. Directed Roads time limit per test 2 seconds ...

  3. CodeForces 711D Directed Roads (DFS找环+组合数)

    <题目链接> 题目大意: 给定一个$n$条边,$n$个点的图,每个点只有一条出边(初始状态),现在能够任意对图上的边进行翻转,问你能够使得该有向图不出先环的方案数有多少种. 解题分析: 很 ...

  4. 与图论的邂逅06:dfs找环

    当我在准备做基环树的题时,经常有了正解的思路确发现不会找环,,,,,,因为我实在太蒻了. 所以我准备梳理一下找环的方法: 有向图 先维护一个栈,把遍历到的节点一个个地入栈.当我们从一个节点x回溯时无非 ...

  5. HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)

    求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环 ...

  6. Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan —— DFS找环

    题目链接:http://codeforces.com/contest/742/problem/C C. Arpa's loud Owf and Mehrdad's evil plan time lim ...

  7. Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3) C. Peaceful Rooks (思维,dsu找环)

    题意:一个棋盘上有一些"车",现在要让这些"车"跑到左倾斜的对角线上,每次可以移动一个棋子,但是棋盘的任意时刻都不能出现一个"车"能吃另一个 ...

  8. New Reform---cf659E(dfs找环)

    题目链接:http://codeforces.com/problemset/problem/659/E 给你n个点,m条双向边,然后让你把这些边变成有向边,使得最后的图中入度为0的点的个数最少,求最少 ...

  9. UVaLive 6950 && Gym 100299K Digraphs (DFS找环或者是找最长链)

    题意:有n个只包含两个字母的字符串, 要求构造一个m*m的字母矩阵, 使得矩阵的每行每列都不包含所给的字符串, m要尽量大, 如果大于20的话构造20*20的矩阵就行了. 析:开始吧,并没有读对题意, ...

随机推荐

  1. Jmeter+Ant+Jenkins集成抛出异常java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage

    一.问题描述 二.解决方法 下载javax.mail.jar插件,并将该插件放到%ANT_HOME%\lib目录下即可解决,下载地址:https://javaee.github.io/javamail ...

  2. C# 使用TopShelf实现Windows服务部署

    一.TopShelf介绍 topShelf是创建Windows服务的一种方式,可以方便管理应用服务,最大广泛应用于,数据实时接收,定时推送等. 二.TopShelf使用 1.安装 TopShelf程序 ...

  3. 一个神奇的HTML标签-----marquee

    今天无意中发现了一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 语法:<marquee>...</marqu ...

  4. React Hook父组件获取子组件的数据/函数

    我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用.文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hoo ...

  5. LeetCode刷题191122

    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 算法: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. ...

  6. docker可视化工具Portainer部署与汉化

    为了更好的观察Docker运行状态,我们采用Portainer工具进行可视化,下面是部署过程总结: 环境: Liunx:CentOS Linux release 7.6.1810 (Core) Doc ...

  7. 使用Active Database Duplication创建跨平台Data Guard设置 (Windows/Linux) (Doc ID 881421.1)

    Using Active Database Duplication to Create Cross Platform Data Guard Setup (Windows/Linux) (Doc ID ...

  8. 损失函数———有关L1和L2正则项的理解

    一.损失函: 模型的结构风险函数包括了   经验风险项  和  正则项,如下所示: 二.损失函数中的正则项 1.正则化的概念: 机器学习中都会看到损失函数之后会添加一个额外项,常用的额外项一般有2种, ...

  9. Codeforces 547C/548E - Mike and Foam 题解

    目录 Codeforces 547C/548E - Mike and Foam 题解 前置芝士 - 容斥原理 题意 想法(口胡) 做法 程序 感谢 Codeforces 547C/548E - Mik ...

  10. 安装PS

    1:下载溜云库 2:查找PS软件,下载 3:按照教程安装