1165. 单词环(spfa求负环)「建议收藏」

1165. 单词环(spfa求负环)「建议收藏」我们有 n 个字符串,每个字符串都是由 a∼z 的小写英文字母组成的。如果字符串 A 的结尾两个字符刚好与字符串 B 的开头两个字符相匹配,那么我们称 A 与 B 能够相连(注意:A 能与 B 相连不代表 B 能与 A 相连)。我们希望从给定的字符串中找出一些,使得它们首尾相连形成一个环串(一个串首尾相连也算),我们想要使这个环串的平均长度最大。如下例:ababcbckjacacaahoynaab第一个串能与第二个串相连,第二个串能与第三个串相连,第三个串能与第一个串相连,我们按照此顺序相连,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我们有 n 个字符串,每个字符串都是由 a∼z 的小写英文字母组成的。

如果字符串 A 的结尾两个字符刚好与字符串 B 的开头两个字符相匹配,那么我们称 A 与 B 能够相连(注意:A 能与 B 相连不代表 B 能与 A 相连)。

我们希望从给定的字符串中找出一些,使得它们首尾相连形成一个环串(一个串首尾相连也算),我们想要使这个环串的平均长度最大。

如下例:

ababc
bckjaca
caahoynaab
第一个串能与第二个串相连,第二个串能与第三个串相连,第三个串能与第一个串相连,我们按照此顺序相连,便形成了一个环串,长度为 5+7+10=22(重复部分算两次),总共使用了 3 个串,所以平均长度是 223≈7.33。

输入格式
本题有多组数据。

每组数据的第一行,一个整数 n,表示字符串数量;

接下来 n 行,每行一个长度小于等于 1000 的字符串。

读入以 n=0 结束。

输出格式
若不存在环串,输出”No solution”,否则输出最长的环串的平均长度。

只要答案与标准答案的差不超过 0.01,就视为答案正确。

数据范围
1≤n≤105

输入样例:
3
intercommunicational
alkylbenzenesulfonate
tetraiodophenolphthalein
0
输出样例:
21.66

题解
0/1分数规划,spfa求负环

#include<bits/stdc++.h>
using namespace std;
const int N = 7e2 + 10;
const int M = 2e5 + 10;
const double eps = 1e-6;
map<string,int>mm;
int ctx;
struct Edge{ 
   
    int v,next,w;
}edge[M];
int head[N],cnt;
void add(int u,int v,int w){ 
   
    edge[cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}
int q[N],hh = 0,tt = 0;
double dist[N];
int num[N],vis[N];
    int n;
bool check(double mid){ 
   
    memset(vis,0,sizeof vis);
    memset(num,0,sizeof num);
    hh = tt = 0;
    for(int i = 0;i < ctx;i ++){ 
   
        vis[i] = true;
        q[tt ++] = i;
    }
    int count = 0;
    while(hh != tt){ 
   
        int t = q[hh ++];
        if(hh == N)hh = 0;
        vis[t] = false;
        for(int i = head[t];~i;i =edge[i].next){ 
   
            int v = edge[i].v;
            double w = edge[i].w - mid;
            if(dist[v] < dist[t] + w){ 
   
                dist[v] = dist[t] + w;
                num[v] = num[t] + 1;
                if(++ count > 2 * n)return true;        //trick当总的更新次数大于 2 * 边数的时候
                if(num[v] >= ctx)return true;
                if(!vis[v]){ 
   
                    vis[v] = true;
                    q[tt ++] = v;
                    if(tt == N)tt = 0;
                }
            }
        }
    }
    return false;
}
int main(){ 
   
    while(cin>>n,n){ 
   
        string word;
        ctx = 0;
        mm.clear();
        memset(head,-1,sizeof head);
        for(int i = 0;i < n;i ++){ 
   
            cin>>word;
            int len = word.size();
            string start = word.substr(0,2);
            string end = word.substr(word.size() - 2);
            if(!mm.count(start))mm[start] = ctx ++;
            if(!mm.count(end))mm[end] = ctx ++;
            int a = mm[start],b = mm[end];
            add(a,b,len);
        }
        double l = 0.0,r = 1000.0;
        while(r - l > eps){ 
   
            double mid = (l + r) / 2;
            if(check(mid))l = mid;
            else r = mid;
        }
        if(abs(l - 0) < eps)cout<<"No solution"<<endl;
        else printf("%.2lf\n",r);
    }
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168623.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 智能营销增益模型(Uplift Modeling)的原理与实践

    智能营销增益模型(Uplift Modeling)的原理与实践文章目录增益模型因果与推论(CausalInference)增益模型的表示差分响应模型(Two-ModelApproach)模型优缺点差分响应模型升级版(One-ModelApproach)ClassTransformationMethodClassTransformation的两个假设ModelingUpliftDirectly增益模型的评估uplift柱状图Qini曲线(Qi…

    2022年10月22日
    0
  • SQL like对时间查询的处理方法

    SQL like对时间查询的处理方法1.SQLlike对时间查询的处理方法SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-812:12:00和2005-6-614:02:02我用下面语句什么也搜不出来select

    2022年7月15日
    98
  • python执行测试用例_测试用例是由什么组成

    python执行测试用例_测试用例是由什么组成前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

    2022年7月29日
    3
  • 从底层结构开始学习FPGA(16)—-PLL/MMCM IP的定制与测试

    从底层结构开始学习FPGA(16)—-PLL/MMCM IP的定制与测试PLLIP核你会用吗?

    2025年5月25日
    0
  • docker部署vue项目_docker部署java

    docker部署vue项目_docker部署java第一步:vue项目打包成dist。npmrunbuild第二步:构建Dockerfile#设置基础镜像,这里使用最新的nginx镜像,前面已经拉取过了FROMnginx#将dist文件中的内容复制到/usr/share/nginx/html/这个目录下面COPYdist//usr/share/nginx/html/第三步:安装nginxdockerpullnginxdockerrun–namenginx-d-p4030:8.

    2022年10月19日
    0
  • Spring Cloud原理解析

    Spring Cloud原理解析本文为转载文章,作者:中华石杉,十余年BAT架构经验,倾囊相授。作者微信公众号:石杉的架构笔记(ID:shishan100)概述毫无疑问,SpringCloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对SpringCloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈SpringCloud微…

    2022年9月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号