牛客多校第十场 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\n");
        }
        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\n");
            else
                printf("3-methylpentane\n");
        }
        else if (flag == 2)
        {
            printf("2,3-dimethylbutane\n");
        }
        else if (flag == 3)
        {
            printf("2,2-dimethylbutane\n");
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/isakovsky/p/11371587.html