潜行世界

总时间限制: 
10000ms

内存限制: 
256000kB
描述

HJA和学弟还在旅游中,这次他们来到了潜行世界。潜行世界是一个N个点M条边的有向无环图。每条路对于HJA和学弟都一个吸引指数,我们把它叫做这条边的权值。权值越大,HJA和学弟就越有可能走这条路。假设HJA和学弟现在在点u,点u出发的所有边的权值之和为s,从u到v的边的权值为w,那么他们选择走向v的概率就是。为了使得问题变得更加简单,HJA决定在开始前删掉任意一条边(也可以不删)。当HJA和学弟走到一个没有出边的点时,这次旅行就结束了。HJA想知道,如果他和学弟从零号点出发,他们期望走的长度最长是多少呢?(每条边的长度都为1)

输入
第一行两个正整数N、M,代表图的点数和边数。
接下来M行每行三个整数S、E、D,代表S到E有一条权值为D的边。
输出
一行一个实数代表答案,误差不得超过1e-6。(没有spj,有问题就找zhx)
样例输入
4 5
0 1 2
0 2 1
0 3 3
1 3 1
2 3 4
样例输出
2.000000
提示
对于50%的数据,1≤N≤500。
对于100%的数据,1≤N≤10,000,1≤M≤100,000,所有边权不超过103。
来源
zhonghaoxi
這道題在考場上將無向圖與樹搞混了,用樹形DP的思路來做得這道題,上述思路會出現算重的問題。
這道題的正解是預處理計算到每個點的概率,在枚舉刪邊。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 110000
#define MAXV MAXN*2
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
#define PROB "secretbase"
typedef long long qword;
inline int nextInt()
{
char ch;
int x=;
bool flag=false;
do
ch=getchar(),flag=(ch=='-')?true:flag;
while(ch<''||ch>'');
do x=x*+ch-'';
while (ch=getchar(),ch<='' && ch>='');
return x*(flag?-:);
} int n,m;
struct Edge
{
int np,val;
Edge *next;
}E[MAXN],*V[MAXV];
int tope=-;
void addedge(int x,int y,int z)
{
E[++tope].np=y;
E[tope].val=z;
E[tope].next=V[x];
V[x]=&E[tope];
}
int totw[MAXN];
int el[MAXE][];
bool vis[MAXN];
queue<int> Q;
int seq[MAXN],tops=-;
int dego[MAXN];
int degi[MAXN];
double poss[MAXN],g[MAXN];;
int main()
{
freopen(PROB".in","r",stdin);
freopen(PROB".out","w",stdout);
int i,j,k;
int x,y,z;
scanf("%d%d",&n,&m);
for (i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
totw[x]+=z;
addedge(x,y,z);
dego[x]++;
degi[y]++;
el[i][]=x;
el[i][]=y;
el[i][]=z;
}
memset(vis,,sizeof(vis));
for (i=;i<n;i++)
{
if (!degi[i])
{
Q.push(i);
vis[i]=true;
}
}
int now;
Edge *ne;
while (!Q.empty())
{
now=Q.front();
Q.pop();
seq[++tops]=now;
for (ne=V[now];ne;ne=ne->next)
{
if (vis[ne->np])continue;
degi[ne->np]--;
if (!degi[ne->np])
{
Q.push(ne->np);
vis[ne->np]=true;
}
}
}
poss[]=;
for (i=;i<=tops;i++)
{
now=seq[i];
for (ne=V[now];ne;ne=ne->next)
{
poss[ne->np]+=poss[now]*ne->val/totw[now];
}
}
tope=-;
memset(V,,sizeof(V));
memset(vis,,sizeof(vis));
for (i=;i<n;i++)g[i]=1e100;
for (i=;i<m;i++)
{
addedge(el[i][],el[i][],el[i][]);
}
for (i=;i<n;i++)
{
if (!dego[i])
{
vis[i]=true;
Q.push(i);
g[i]=;
}
}
tops=-;
while (!Q.empty())
{
now=Q.front();
Q.pop();
seq[++tops]=now;
for (ne=V[now];ne;ne=ne->next)
{
if (vis[ne->np])continue;
dego[ne->np]--;
if (!dego[ne->np])
{
Q.push(ne->np);
vis[ne->np]=true;
}
}
}
// for (i=0;i<=tops;i++)printf("%d ",seq[i]);printf("\n");
memset(V,,sizeof(V));
tope=-;
for (i=;i<m;i++)
{
addedge(el[i][],el[i][],el[i][]);
}
for (i=;i<=tops;i++)
{
now=seq[i];
if (!g[now])continue;
g[now]=;
for (ne=V[now];ne;ne=ne->next)
{
g[now]+=g[ne->np]*ne->val/totw[now];
}
g[now]+=;
}
// for (i=0;i<n;i++)printf("%lf ",g[i]);
double delta=-1e100;
double t;
double gn;
for (i=;i<m;i++)
{
if (totw[el[i][]]==el[i][])
{
gn=;
}else
gn=(g[el[i][]]-(g[el[i][]]+)*el[i][]/totw[el[i][]])*totw[el[i][]]/(totw[el[i][]]-el[i][]);
delta=max((gn-g[el[i][]])*poss[el[i][]],delta);
}
delta=max(0.0,delta);
printf("%.6lf ",g[]+delta);
return ;
}

Contest 20140923 潛行世界 拓撲排序,期望的更多相关文章

  1. [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】

    题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 < ...

  2. 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率

    [BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...

  3. 【BZOJ3012】[Usaco2012 Dec]First! Trie树+拓补排序

    [BZOJ3012][Usaco2012 Dec]First! Description Bessie has been playing with strings again. She found th ...

  4. QRowTable表格控件-支持hover整行、checked整行、指定列排序等

    目录 一.开心一刻 二.嘴一嘴 三.效果展示 四.浅谈实现 五.自定义数据源 1.data函数 2.flags函数 六.自定义视图 1.目的 2.问题分析 七.测试 八.相关文章 原文链接:QRowT ...

  5. HDU 1811 Rank of Tetris 拓补排序+并查集

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [ ...

  6. 命令行传递参数并排序 AS实现加法

    题目:从命令行输入参数并进行排序 1.实验准备 Integer提供了能在 int 类型和 String 类型之间互相转换的方法,还提供了处理 int 类型时非常有用的其他一些常量和方法. static ...

  7. 利用插件(jQuery-ui.js)实现表格行的拖拽排序

    template 模板(html) 首先要引入jQuery-ui.js的文件.import './../../scripts/base/jquery/jquery-ui.min.js';<tab ...

  8. LeetCode 42接雨水 按行求解(差分+排序)

    按行求解的思路比较清晰明了,但是这个方法的复杂度高达O(heightSize*sum(height[i])),几乎高达O(N^2). 但是也并不是不可以解决,经观察我们可以发现,这个算法的缺点在于要遍 ...

  9. HDU 1285 拓普排序 基本模板例题 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

随机推荐

  1. Velocity源码分析

    velocity模板渲染的步骤: 1) 首先初始化启动Velocity引擎,可以通过Velocity.init()或者新建VelocityEngine类,并调用其中的init()方法: 2) 创建一个 ...

  2. PMP考试的过与只是

    我在一年多时间里參加了三次PMP考试,前两次都失败,直到第三次才成功.怎样对待失败?这是每个人都会遇到的挑战.假设我们能用正确的态度对待临时的失败,那么终于的成功也就不远了.我希望通过本文与大家分享一 ...

  3. 版本控制-git的使用

    最近刚到公司实习,知道了版本控制,并略微会用了git的版本控制,下面就简单的记录一下,给健忘的自己日后回顾~ 师傅教我的是命令行的使用,所以暂时只说命令行的方法, 1.首先进入CLone到本地的那个本 ...

  4. day-8

    /* 倒数8天了 今天高考报名 两个班主任都来了23333 然后填班主任姓名就尴尬了23333 上午考试 挺不错的题目 都不是很水 但需要思考 而我是一脸的懵逼~~ 下午整理各种板子 主要是图论的 最 ...

  5. css3中允许单词内断句word-wrap和怎么处理断句word-break

    首先说一下:浏览器的默认行为,在一行中几个单词 排列着,如果最后一个长单词 太长时 首先是移到下一行,如果该单词的长度大于父元素的宽度,会溢出. <!doctype html> <h ...

  6. artTemplate模板引擎的源码拜读

    最初接触的模板引擎还是基于node的ejs,当时觉得很神奇原来还可以这么玩,后来随着学习的深入,使用过jade,doT等,当然还有一些比较火的诸如juicer.underscore还没有深入接触,直到 ...

  7. 如何快速学习bootstrap

    bootstrap中文网http://www.bootcss.com/解决了我所有使用bootstrap的问题,从0开始,下面的全部链接都是该网站的子链接.例子http://v3.bootcss.co ...

  8. Css3 兼容新旧浏览器

    想想10年前用 IE6,火狐,遨游,谷歌等浏览器学习css时,那叫一个艰苦,各种hack各种抓耳挠腮,不是margin塌陷就是元素飞了... 当前借着css3这个东风,如果各大浏览器厂商能统一一下,也 ...

  9. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

    在使用Fragment的过程中,常常会遇到在Activity的onSaveInstanceState方法调用之后,操作commit或者popBackStack而导致的crash. 因为在onSaveI ...

  10. AsyncTask理解- Day36or37

    AsyncTask理解- Day36or37 mobile 5.0 1.手机归属地查询 AtoolsActivity Assets目录特点 该文件是原生文件,不会对里面的文件进行编码 该文件只支持读取 ...