题目链接:点击打开链接
就是给了一个树形的烷烃,输出他的科学命名
然后写写写。。。
==强行回忆高中化学
#include<stdio.h> #include <iostream> #include<cmath> #include<cstring> #include<algorithm> #include <string> #include<queue> #include<vector> template <class T> inline bool rd(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template <class T> inline void pt(T x) { if (x <0) { putchar('-'); x = -x; } if (x>9) pt(x / 10); putchar(x % 10 + '0'); } const int N = 50; using namespace std; string name[N] = { "ewrt", "meth", "eth", "prop", "but", "pent", "hex", "hept", "oct", "non", "dec", "undec", "dodec", "tridec", "tetradec", "pentadec" }; vector<int>G[N]; struct hehe{ int dis[N], pre[N], id, sum; vector<int>D[N]; int dfs(int u, int fa){ int siz = 1; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (v != fa) siz += dfs(v, u); } return siz; } int bfs(int s, int t){ memset(dis, -1, sizeof dis); memset(pre, -1, sizeof pre); dis[s] = 1; queue<int>q; q.push(s); while (!q.empty()){ int u = q.front(); q.pop(); for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (dis[v] != -1)continue; dis[v] = dis[u] + 1; pre[v] = u; q.push(v); } } int last = -1, val = 0; while (t != -1){ for (int i = 0; i < G[t].size(); i++) { int v = G[t][i]; if (v != last && v != pre[t]){ if (id == -1 || id > dis[t]) id = dis[t]; sum += dis[t]; D[dfs(v, t)].push_back(dis[t]); } } last = t; t = pre[t]; } } int T; void work(int s, int t){ T = t;// printf(" %d->%d\n", s, t); id = -1; sum = 0; for (int i = 0; i < N; i++)D[i].clear(); bfs(s, t); for (int i = 0; i < N; i++)sort(D[i].begin(), D[i].end()); /* for(int i = 0; i <N; i++)if(D[i].size()){printf("%d: ", i);for(int j = 0; j < D[i].size(); j++)printf("%d ", D[i][j]);puts("");}*/ } int big(int x, int y){ if(D[x].size()!=D[y].size())return D[x].size()<D[y].size(); return x<y; } void put(){ int f = 0; bool vis[N]; memset(vis,0,sizeof vis); for (int i , tim = 1; tim < N; tim++) { int pos = -1; for(int j = 1; j < N; j++) if(vis[j]==0 && D[j].size() && (pos == -1 || big(j,pos))) pos = j; if(pos == -1)break; vis[pos] = 1; i = pos; if (f++) putchar('-'); for (int j = 0; j < D[i].size(); j++) { if (j)printf(","); printf("%d", D[i][j]); } putchar('-'); if (2 == (int)D[i].size()) printf("di"); else if (3 == (int)D[i].size()) printf("tri"); else if (4 == (int)D[i].size()) printf("tetra"); else if ((int)D[i].size() > 4){ cout << name[D[i].size()]; printf("a"); } cout << name[i]; printf("yl"); } cout << name[dis[T]]; puts("ane"); } }b[2]; int dis[N], pre[N]; int bfs(int s, int t){ memset(dis, -1, sizeof dis); memset(pre, -1, sizeof pre); dis[s] = 0; queue<int>q; q.push(s); while (!q.empty()){ int u = q.front(); q.pop(); for (int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if (dis[v] != -1)continue; dis[v] = dis[u] + 1; pre[v] = u; q.push(v); } } int last = -1, val = 0; while (t != -1){ for (int i = 0; i < G[t].size(); i++) { int v = G[t][i]; if (v != last && v != pre[t])val++; } last = t; t = pre[t]; } return val; } int n, m, len, a[2], siz; void find_total(){ len = siz = 0; for (int i = 1; i <= n; i++) for (int j = i + 1; j <= n; j++) { int tmp = bfs(i, j); if (dis[j] > len || (dis[j] == len && tmp > siz)){ len = dis[j]; a[0] = i; a[1] = j; siz = tmp; } } /// printf("%d->%d\n", a[0], a[1]); } void input(){ for (int i = 0; i < N; i++)G[i].clear(); int u, v; while (m--){ scanf("%d %d", &u, &v); G[u].push_back(v); G[v].push_back(u); } } int main() { while (~scanf("%d %d", &n, &m)){ input(); find_total(); b[0].work(a[0], a[1]); b[1].work(a[1], a[0]); if (b[0].id<b[1].id) b[0].put(); else if (b[0].id>b[1].id) b[1].put(); else { if (b[0].sum < b[1].sum) b[0].put(); else if(b[0].sum > b[1].sum) b[1].put(); else { int id = -1; for(int i = N-1; id==-1 && i >= 0; i--) { if(b[0].D[i].size()>b[1].D[i].size()) id = 0; else if(b[0].D[i].size()<b[1].D[i].size()) id = 1; else { for(int j = 0; j < b[0].D[i].size(); j++) if(b[0].D[i][j]<b[1].D[i][j]) id = 0; else if(b[0].D[i][j]>b[1].D[i][j]) id = 1; } } if(id==-1)id=0; b[id].put(); } } // b[0].put(); b[1].put(); } return 0; } /* 10 9 1 2 2 3 2 4 4 5 4 6 4 9 9 10 6 8 6 7 2,3,4-trimethyl-3-ethylpentane 10 9 1 2 2 5 2 6 2 3 3 7 3 8 3 4 8 9 8 10 12 11 1 2 2 5 2 6 2 3 3 7 7 11 3 8 3 4 8 9 8 10 7 12 14 13 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 2 10 8 11 4 13 13 14 6 12 14 13 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 3 10 7 11 4 13 10 14 6 12 */
时间: 2024-10-11 05:59:53