• CodeForces


    题意

    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; }

  • 相关阅读:
    hadoop20---代理另一种方式
    hadoop19---动态代理
    hadoop18---socket实现rpc
    JAVA发送HttpClient
    使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)
    hadoop17---RPC和Socket的区别
    hadoop16---反射
    hadoop15---activemq
    Struts2标签实现for循环
    struts2的标签中得到JSP脚本的变量值
  • 原文地址:https://www.cnblogs.com/mcq1999/p/12002814.html
Copyright © 2020-2023  润新知