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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity–Cinemachine官方实例详解

    Unity–Cinemachine官方实例详解1.2DCamera搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create2DCamera,在生成的相机中设置follow,同时注意body的设置,如下图所示在虚拟相机中还需要添加Cinemachineconfiner组件,点击下图中的AddExtension,在弹出的下拉列表中,选择CinemachineConfiner。用来后处…

    2022年5月8日
    51
  • ElasticSearch数据库安装与配置[通俗易懂]

    ElasticSearch数据库安装与配置[通俗易懂]1、安装去官网下载安装包:https://www.elastic.co/cn/downloads/elasticsearch解压改压缩包就行,解压后的目录如下2、配置进入bin目录,双击elasticsearch.bat即可启动数据库服务。在浏览器中输入localhost:9200即可查看是否启动成功:显示上面的json串则表示启动成功。下面介绍如何配置可远程连接:需要修改config目录下的elasticsearch.yml文件在elastcisearch.yml文件中加上如下配

    2022年5月3日
    118
  • 正则匹配数字,英文以及英文符号

    正则匹配数字,英文以及英文符号网上搜索很多正则验证方法,但都没有一个理想的解决方式。自己总结了下,对于这个问题目前是两种解决方式。1、通过循环字符串对每一个字符进行验证,这个方式简单就不做介绍了2、通过ASCII码匹对符合的次数来判断是否匹配(不要循环)第二种方式是不通过循环来进行正则的验证到达检测效果,这也是博主没找到合适的方法原因(总觉循环没必要)。newRegExp(“[\x20-\x7E]{“+str.length+”}”)通过数字,英文以及英文符号ASCII码的范围对字符串验证,并且加上其出现的次数,如果没有出现

    2022年6月22日
    164
  • pycharm mac 激活码【2021最新】

    (pycharm mac 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4M7HSKPBXS-eyJsa…

    2022年3月29日
    257
  • ToF相机学习笔记之基本知识

    ToF相机学习笔记之基本知识ToF相机属于一种非接触式光学传感器,通过计算发射激光的飞行时间获取对应像素的深度信息。就非接触式距离测量方法而言,其分类可用下表表示如下:1.1ToF传感器基础一个逐点式的ToF传感器采用了雷达原理估计场景点的径向距离。简单来说,就是通过计算光从发射到经场景点反射后的飞行时间。为了测量整个场景表面而不是几个场景点,很多距离测量系统集成了一个逐点式ToF传…

    2022年5月20日
    29
  • 搭建自己的git服务器_自建服务器

    搭建自己的git服务器_自建服务器在服务器端:新建一个空git仓库sudogitinit–baresample.gitsudochown-Rgit:gitsample.git在本地:添加remotegitremoteaddmyservergit@server_ip:/path-to-git-repo把本地内容push上去gitadd.gitcommit-m”xxx”…

    2022年10月5日
    5

发表回复

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

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