1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <bits/stdc++.h> using namespace std;
const int N = 50500; const double eps = 1e-9; int n, cnt, head[N]; double dis[N]; bool vis[N]; char s[1005]; struct E {int nxt, v; double w;} e[N << 2]; void add(int u, int v, double w) {e[++cnt] = {head[u], v, w}; head[u] = cnt;}
bool dfs(int x, const double mid) { vis[x] = 1; for (int i = head[x]; i; i = e[i].nxt) { int v = e[i].v; double w = e[i].w - mid; if (dis[v] < dis[x] + w) { dis[v] = dis[x] + w; if (vis[v]) return 1; if (dfs(v, mid)) return 1; } } vis[x] = 0; return 0; } bool check(double mid) { memset(vis, 0, sizeof vis); memset(dis, 0, sizeof dis); for (int i = 0; i <= 5000; i++) { if (dfs(i, mid)) return 1; } return 0; }
int main() { while (scanf("%d", &n) != EOF && n) { memset(head, 0, sizeof head); cnt = 0; for (int i = 1; i <= n; i++) { scanf("%s", s + 1); int len = strlen(s + 1); if (len < 2) continue; int pre = (s[1] - 'a') * 26, suf = (s[len - 1] - 'a') * 26; pre = pre + s[2] - 'a', suf = suf + s[len] - 'a'; double bl = 1.0 * len; add(pre, suf, bl); } double l = 0.0, r = 1005.0; while (r - l > eps) { double mid = (r + l) / 2.0; if (check(mid)) l = mid; else r = mid; } if (l == 0.0) puts("No solution"); else printf("%.2lf\n", l); } return 0; }
|