poj 2049(二分+spfa判负环)

给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边。问字符串环的平均最小值是多少。1 ≤ n ≤ 100000,有多组数据。

首先根据套路,二分是显然的。然后跑一下spfa判断正环就行了。

然而我被no solution坑了十次提交。。

#include <cctype>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn=1e5+5, maxm=1e5+5;
const double eps=1e-4; struct Graph{
struct Edge{
int to, next, v; Graph *bel;
inline int operator *(){ return to; }
Edge& operator ++(){
return *this=bel->edge[next]; }
};
void reset(){
cntedge=0; memset(fir, 0, sizeof(fir)); }
void addedge(int x, int y, int v){
Edge &e=edge[++cntedge];
e.to=y; e.next=fir[x]; e.v=v;
e.bel=this; fir[x]=cntedge;
}
Edge& getlink(int x){ return edge[fir[x]]; }
//////////
Edge edge[maxm*2];
int cntedge, fir[maxn];
}g; int n, len, visit[maxn];
double dis[maxn], l, r, mid; bool flag;
char s[1005]; int trans(char c1, char c2){
return (c1-'a')*26+c2-'a'+1; } bool spfa(int now, double A){
Graph::Edge e=g.getlink(now); visit[now]=1;
for (; *e; ++e){
if (dis[now]+A-e.v<dis[*e]){
dis[*e]=dis[now]+A-e.v;
if (visit[*e]||spfa(*e, A)) return true;
}
} visit[now]=0;
return false;
} int main(){
for (; scanf("%d", &n), n; ){
g.reset();
for (int i=1; i<=n; ++i){
do{
fgets(s, 1e5, stdin);
len=strlen(s);
}while (len<2);
g.addedge(trans(s[0], s[1]),
trans(s[len-3], s[len-2]), len-1);
}
l=0; r=2000;
while (r-l>eps){
mid=(l+r)/2; flag=false;
for (int i=1; i<=26*26; ++i) dis[i]=visit[i]=0;
for (int i=1; i<=26*26; ++i)
if (spfa(i, mid)){ flag=true; break; }
if (flag) l=mid; else r=mid;
}
if (r<=eps) printf("No solution.\n");
else printf("%.3lf\n", (l+r)/2);
}
return 0;
}

poj 2049(二分+spfa判负环)的更多相关文章

  1. poj 3621 二分+spfa判负环

    http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...

  2. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

  3. LOJ #10084. 「一本通 3.3 练习 1」最小圈(二分+SPFA判负环)

    题意描述: 见原LOJ:https://loj.ac/problem/10084 题解: 假设所求的平均最小值为X,环上各个边的权值分别为A1,A2...Ak,可以得到: X=(A1+A2+A3+.. ...

  4. Wormholes POJ 3259(SPFA判负环)

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  5. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  6. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

  7. poj 1364 King(线性差分约束+超级源点+spfa判负环)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14791   Accepted: 5226 Description ...

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

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

  9. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

随机推荐

  1. wireshark 学习 3 display filter

    过滤信息,得到想要的帧进行分析. http://www.networkcomputing.com/networking/wifi-troubleshooting-using-wireshark/155 ...

  2. node版本管理工具 -- nvm安装与使用

    新老项目维护时node环境切换麻烦怎么办? 不用担心,有了nvm ,一个命令就能切换node版本. 首先需要安装nvm工具,进入下载地址. 下载之后安装nvm. nvm安装之后还需要配置两个环境变量( ...

  3. valgrind报错VEX temporary storage exhausted

    valgrind的使用请参考: 使用valgrind进行内存泄漏和非法内存操作检测 最近在使用valgrind进行内存泄漏检测是时,竟然报错,如下: VEX temporary storage exh ...

  4. Contiki Etimer 模块

    一.Etimer概述 Etimer提供产生时间事件(timed event)的机制,当设定好的timer到期时,将会给设定etimer的process发送一个PROCESS_EVENT_TIMER 事 ...

  5. ubuntn14.04 使用 nvm创建多版本node环境

    1. 下载 nvm wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash 2. 然后 ...

  6. L89

    His voice was hoarse after several hours' speech.Attributive adjectives precede the noun.I gave the ...

  7. 【Shell】基础正则表示法及grep用法

    ——<鸟哥的私房菜> 正规表示法就是处理字串的方法,他是以行为单位来进行字串的处理行为:正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字串的处理程序:只 ...

  8. MyEclipse异常关闭导致启动不了tomcat的解决方法

     由于MyEclipse的异常关闭从而导致Tomcat并没有关闭,所以再次启动Tomcat当然是无法启动的啦,解决方法:在任务管理器中关闭一个叫javaw.exe的进程,如果你这时已经启动了MyEcl ...

  9. UVA1389 Hard Life[二分答案+最小割]

    我真菜啊←地址 求最大密度子图方案.密度=边数/点数 假设E,V为最大密度子图的边数点数.则$\forall \rho$有$\rho \leqslant \frac{E}{V}$即$E- \rho V ...

  10. js动态加载activeX控件在IE11与低版本IE中的差异

    由于IE11更加遵循W3C规范,所以IE11与低版本IE在加载activeX时有差别. 1.IE11中动态加载activeX的顺序 var objectTag = document.createEle ...