zoukankan      html  css  js  c++  java
  • 牛客多校第十场 H Stammering Chemists 判断图同构

    题意:

    给出一个无向图,表示一种有机物质的结构式,问你这个有机物质是列表中的哪个。

    题解:

    判断图同构需要枚举全排列以对应点,但是此题中几乎只需要将点度数排序后一个一个比较,对于甲基位置再加个特判即可。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long uLL;
    typedef long long ll;
    typedef pair<int, LL>P;
    const int M = 1e2 + 5;
    const LL mod = 1e9 + 7;
    const LL lINF = 0x3f3f3f3f3f3f3f3f;
    #define ls (rt<<1)
    #define rs (rt<<1|1)
    vector<int>ve[M];
    vector<int>ve2;
    int a[][6] = { {1,1,2,2,2,2},{1,1,1,2,2,3},{1,1,1,1,3,3},{1,1,1,1,2,4} };
    int flag;
    bool isv[M];
    int ans;
    void dfs(int x, int step)
    {
        isv[x] = 1;
        ans = max(ans, step);
        for (int i = 0; i < ve[x].size(); i++)
        {
            if (!isv[ve[x][i]])
            {
                dfs(ve[x][i], step + 1);
            }
        }
    }
    int main()
    {
        int _;
        scanf("%d", &_);
        while (_--)
        {
            for (int i = 1; i <= 6; i++)
            {
                ve[i].clear();
            }
            for (int i = 1; i <= 5; i++)
            {
                int l, r;
                scanf("%d%d", &l, &r);
                ve[l].push_back(r);
                ve[r].push_back(l);
            }
            ve2.clear();
            for (int i = 1; i <= 6; i++)
            {
                ve2.push_back(ve[i].size());
            }
            sort(ve2.begin(), ve2.end());
            for (int i = 0; i < 4; i++)
            {
                flag = i;
                for (int j = 0; j < 6; j++)
                {
                    if (ve2[j] != a[i][j])
                    {
                        flag = 5;
                        break;
                    }
                }
                if (flag != 5)
                    break;
            }
            if (flag == 0)
            {
                printf("n-hexane
    ");
            }
            else if (flag == 1)
            {
                ans = 0;
                memset(isv, 0, sizeof isv);
                for (int i = 1; i <= 6; i++)
                {
                    if (ve[i].size() == 3)
                    {
                        dfs(i, 0);
                    }
                }
                if (ans == 3)
                    printf("2-methylpentane
    ");
                else
                    printf("3-methylpentane
    ");
            }
            else if (flag == 2)
            {
                printf("2,3-dimethylbutane
    ");
            }
            else if (flag == 3)
            {
                printf("2,2-dimethylbutane
    ");
            }
        }
    }
  • 相关阅读:
    20200816
    20200815
    20200813
    20200811
    20200810
    20200806
    20200804
    20200803
    20200802
    20200801
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11371587.html
Copyright © 2011-2022 走看看