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;
}

最新文章

  1. C#学习笔记-封装
  2. 15套帮助你展示 App 设计的透视屏幕原型素材
  3. 一道题看bitset应用 --ZOJ 3642
  4. (转) TensorFlow深度学习,一篇文章就够了
  5. 算法库:jpeglib和pnglib安装配置
  6. Tiny6410声卡驱动——录音与回放
  7. python调win32api调整屏幕分辨率
  8. Android入门——UI(2)
  9. Android笔记二十七.Service组件入门(一).什么是Service?
  10. 《Metasploit魔鬼训练营》第七章学习笔记
  11. 反射调用DLL
  12. MVC开发中的常见错误-06-&quot;无法在发送 HTTP 标头之后进行重定向。&quot;
  13. java.lang.System.setProperty()方法实例
  14. slave库写redo、binlog不实时丢数据的场景
  15. Jquery各版本下载
  16. 浅谈HashMap 的底层原理
  17. SpringMVC源码解析 - HandlerAdapter - @SessionAttributes注解处理
  18. 为什么在AI领域网络安全更重要?先睹为快~
  19. final方法,abstract方法和abstract类,native方法
  20. linux下安装多个jdk版本的切换问题

热门文章

  1. STemWin显示汉字 — SD卡外挂XBF字库
  2. delphi XE7 HttpEncode 编码问题
  3. deepin网络加速
  4. 一步一步教你简单完成 Android USB开发
  5. 迁移学习——使用Tensorflow和VGG16预训模型进行预测
  6. Log4Net的使用之winform
  7. install docker
  8. codeforces 658C C. Bear and Forgotten Tree 3(tree+乱搞)
  9. linux命令学习笔记(26):用SecureCRT来上传和下载文件
  10. 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)