题意:
给出一个无向图,表示一种有机物质的结构式,问你这个有机物质是列表中的哪个。
题解:
判断图同构需要枚举全排列以对应点,但是此题中几乎只需要将点度数排序后一个一个比较,对于甲基位置再加个特判即可。
#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 "); } } }