传送门

这题要先巧妙的转化一下。

对于每个字符串,我们把头尾的两个小字符串对应的点连边,边权是这个字符串的长度。

这样最多会出现26*26个点。

这个时候就只用求出边权和跟边数的最大比值了。

这个显然01分数规划+spfa判环解决。

注意用dfs版的spfa要快一些。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define N 200005
using namespace std;
int n,first[N],id1,id2,cnt,tot,len;
bool in[N];
double dis[N];
char s[1005];
struct edge{int v,next,w;}e[N<<2];
inline int idx(char a,char b){return (a-'a')*26+b-'a'+1;}
inline void add(int u,int v,int w){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].w=w,first[u]=cnt;}
inline bool check(double a,double b){return fabs(a-b)>=1e-10;}
inline bool spfa(int p,double mid){
    in[p]=true;
    for(int i=first[p];i;i=e[i].next){
        int v=e[i].v;
        if(dis[v]>dis[p]+mid-e[i].w){
            dis[v]=dis[p]+mid-e[i].w;
            if(in[v]||spfa(v,mid)){in[p]=false;return true;}
        }
    }
    return in[p]=false;
}
inline bool judge(double mid){
    memset(dis,0,sizeof(dis));
    for(int i=1;i<=26*26;++i)if(spfa(i,mid))return true;
    return false;
}
int main(){
    while(scanf("%d",&n)&&n){
        cnt=0,memset(first,0,sizeof(first));
        for(int i=1;i<=n;++i){
            scanf("%s",s),len=strlen(s);
            if(len<2)continue;
            id1=idx(s[0],s[1]),id2=idx(s[len-2],s[len-1]),add(id1,id2,len);
        }
        double l=0.0,r=1000.0;
        while(check(l,r)){
            double mid=(l+r)/2;
            if(judge(mid))l=mid;
            else r=mid;
        }
        if(l==0.0)puts("No solution.");
        else printf("%.4lf\n",l);
    }
    return 0;
}

2018.09.09 poj2949Word Rings(01分数规划+spfa判环)的更多相关文章

  1. 2018.09.12 poj3621Sightseeing Cows(01分数规划+spfa判环)

    传送门 01分数规划板题啊. 发现就是一个最优比率环. 这个直接二分+spfa判负环就行了. 代码: #include<iostream> #include<cstdio> # ...

  2. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  3. 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)

    传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...

  4. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  5. [HNOI2009]最小圈 分数规划 spfa判负环

    [HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...

  6. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  7. bzoj 1690: [Usaco2007 Dec]奶牛的旅行【01分数规划+spfa】

    把add传参里的double写成int我也是石乐志-- 首先这个东西长得就很01分数规划 然后我不会证为什么没有8字环,我们假装他没有 那么设len为环长 \[ ans \leq \frac{\sum ...

  8. [P1768]天路(分数规划+SPFA判负环)

    题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...

  9. bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

    PS:此题数组名皆引用:戳我 题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加.求一个环使得收益和/花费和最大,输出这个比值. ...

随机推荐

  1. PHP 实现-多线程编程

    前些天帮同事查一个问题,第一次接触到了 PHP 的多线程,原以为 PHP 普遍都是单线程模型,并不适合多线程领域,花些时间翻了几个多线程的项目源码之后,发现 PHP 的多线程也颇有可取之处,活用起来, ...

  2. JAVA时间进行比较和转换,时间加减得到天数

    转自:https://blog.csdn.net/iteye_8535/article/details/82246006 JAVA时间进行比较和转换,时间加减得到天数 1. 把时间类型的字符串转为DA ...

  3. REST 服务器调试 RESTDebugger.exe 和浏览器测试

    开发一个简单的rest服务器, 增加了一些函数,比如返回系统当前时间 如何验证是否正确呢,不需要自己编写客户端调用程序了, 可以直接使用RESTDebugger.exe D:\Program File ...

  4. VB6 让程序结束后带有返回值

    第三方命令行程序运行完之后,批处理中可以随时通过errorlevel变量收取运行结果.而VB写的控制台程序却没有提供这样的功能.关于让控制台程序返回值的教程是本博客独家放出. 返回值,其实也就是进程的 ...

  5. JS 报表制作

    1:Echarts, 界面多样化. http://echarts.baidu.com/index.html 2: Jmgraph 工具 简单的画线工具 http://graph.jm47.com/ 3 ...

  6. 9 python 多态与多态类

    1.多态定义 多态指的是一类事物的多种形态 比如动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractm ...

  7. Enum学习中的compareTo方法分析

    今天看工厂模式的时候里面用了枚举定义各种可能的实例类型,就看了一下枚举,发现里面有一个compareTo(E o)方法 通过Object的getClass()方法比较两个两个比校对象类型是否一致,如果 ...

  8. MVC3 发布到IIS 7.5

    1.应用程序池采用集成模式(建议),.NET Framework版本为: .NET Framework4.0.30319. 2.确保ASP.NET MVC3已安装好,然后检查站点的处理程序映射,看是否 ...

  9. C# 窗口页面卡的处理方案-异步编程委托

    今天用winform做了一个小程序,主要是用于远程数据的登录采集,因为数据量非常大,到时每次点击按钮执行程序的时候界面都会出现假死状态,具体表现是无法拖动窗口,无法最小化或关闭等,只能任务管理进程结束 ...

  10. powerdns

    powerdns http://bbs.51cto.com/thread-880297-1.html https://blog.csdn.net/kepa520/article/details/791 ...