【TOJ 2433】Word Rings【SPFA+二分】
来源:互联网 发布:全球地表覆盖数据下载 编辑:程序博客网 时间:2024/04/30 20:55
题意:给出n个字符串,字符串衔接的方式是前两个字母和后两个字母相同,问连成一个环的平均长度最大是多少。
思路:我们二分这个平均长度len,假设m个边连成一个环,每条边的长度分别是l1.l2.l3...lm,则∑li / m = len;,即存在一个环使得∑li >= len*m 把式子经过整理之后得到
∑li-len >= 0因而转化成判断是否存在一个正环,可以用spfa判断。注意的是这里要建一个超级节点,使得整个图是联通的。
#include <cmath>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;#define N 100004#define inf 0x3f3f3f3f#define vn 26*26#define eps 1e-9struct E { int v, ne; double d; E(){} E(int _v, double _d, int _ne): v(_v), d(_d), ne(_ne){}}e[N];int size, head[800];int mp[26*30][26*30];int init() { size = 0; memset(head, -1, sizeof(head));}void add(int u, int v, double d) { e[size] = E(v, d, head[u]); head[u] = size++;}char w[1004];double dis[vn+100];bool vis[vn+100];int cnt[vn+100];queue<int>Q;bool spfa(double mid) { memset(vis, false, sizeof(vis)); int i, v, j, u; double d; for (i = 0;i <= vn;i++) { dis[i] = -inf; } memset(cnt, 0, sizeof(cnt)); while (!Q.empty()) Q.pop(); Q.push(0), dis[0] = 0; vis[0] = true;cnt[0]++; while (!Q.empty()) { u = Q.front(); Q.pop(), vis[u] = false; for (i = head[u];~i;i = e[i].ne) { v = e[i].v, d = e[i].d-mid; if (dis[v] < dis[u]+d) { dis[v] = dis[u]+d; cnt[v]++; if (cnt[v] > vn) return true; if (!vis[v]) vis[v] = true, Q.push(v); } } } return false;}int main() { int n, i, j, len; while (scanf("%d", &n), n) { memset(mp, 0, sizeof(mp)); init(); int tm, tv, mx = 0; for (i = 0;i < n;i++) { scanf("%s", w); len = strlen(w); if (len < 2) continue; mx = max(len, mx); tm = (w[0]-'a')*26+(w[1]-'a')+1, tv = (w[len-2]-'a')*26+(w[len-1]-'a')+1; mp[tm][tv] = max(mp[tm][tv], len); } for (i = 1;i <= vn;i++) { for (j = 1;j <= vn;j++) { if (mp[i][j]) add(i, j, mp[i][j]*1.0); } add(0, i, 0); } if (!spfa(0)) { puts("NO solution.");continue;} double f, r, mid; f = 0, r = mx*1.0; while (fabs(f-r) > eps) { mid = (f+r)*0.5; if (spfa(mid)) f = mid; else r = mid; } printf("%.2lf\n", f); }}
0 0
- 【TOJ 2433】Word Rings【SPFA+二分】
- POJ--2924[Word Rings] (二分+SPFA判正环)
- poj2949 Word Rings(建图+二分答案+spfa判正环)
- POJ-2949 Word Rings(SPFA DFS实现 + 环上平均权值最大)
- poj2949-Word Rings
- poj 2949Word Rings
- TOJ 4603 Interesting Calculator -- SPFA
- 【TOJ 2424. 】Easter holidays【SPFA】
- 【TOJ 3402】Man Down【SPFA】
- toj 1153. Word Reversal
- 二分+SPFA
- Rings
- TOj 1153. Word Reversal【栈】
- TOJ 1050 Courses 二分匹配
- TOJ 3875 Flowerpot -- RMQ + 二分
- poj 2949 Word Rings 参数搜索+负环探测
- POJ 2949 Word Rings(差分约束)
- 杭电2842 Chinese Rings 构建矩阵二分幂
- 最长递增子序列
- 托管应用程序和非托管应用程序
- spring的jar下载
- JAVA语言的三种技术架构
- CF#252 (Div. 2) A.
- 【TOJ 2433】Word Rings【SPFA+二分】
- Java语言的特点:跨平台性
- 个人面试总结(共勉)
- [SPOJ GSS2] Can you answer these queries II [线段树]
- 数据结构之哈夫曼树
- hdu2201 熊猫阿波的故事
- 100AC
- 黑马程序员-----初识OC(三)
- C#中get和set不带参数