潜行世界

总时间限制: 
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. eclipse通过classpath variable引用类库

    众所周知.eclipse的project bulid path中能够引用第三方类库(如图1). 图1 可是这样的方式有个缺点:对类库的引用是通过绝对路径.假设有两台电脑(办公室1台.家1台),非常可能 ...

  2. [转]flume-ng+Kafka+Storm+HDFS 实时系统搭建

    http://blog.csdn.net/weijonathan/article/details/18301321 一直以来都想接触Storm实时计算这块的东西,最近在群里看到上海一哥们罗宝写的Flu ...

  3. 在内核外编写的linux驱动程序MAKEFILE

    一般都是这么写: ifneq ($(KERNELRELEASE),) obj-m :=  else KERNELDIR ?= /lib/modules/$(shell uname -r)/build ...

  4. Linux系统下UDP发送和接收广播消息小样例

    [cpp] view plaincopy // 发送端 #include <iostream> #include <stdio.h> #include <sys/sock ...

  5. Linux多网卡多IP配置

    echo "210 local100" >> /etc/iproute2/rt_tables echo "220 local200" >> ...

  6. GUI编程笔记(java)02:java.awt和java.swing包的区别

    1. java.awt和java.swing两者的概述 java.awt:(java的标准包)             Abstract Window ToolKit (抽象窗口工具包),需要调用本地 ...

  7. angularjs 根据变量改变 动态加载模板

    directive return { restrict: 'E', replace: true, templateUrl: 'app/view/order.html', link: function ...

  8. Java中的I/O流

    import java.io.*//生成代表输入流的对象fis=new FileInputStream("e:/src/from.txt") //生成代表输出流的对象 fos=ne ...

  9. [XML] resources的Xml配置文件 (转载)

    <?xml version="1.0" encoding="utf-8" ?> <resources> <language> ...

  10. Maven配置jar(war)包自动打包上传Maven服务器的配置

    Maven配置jar(war)包自动打包上传Maven服务器的配置 创建jar(war)包工程 创建一个maven工程 在工程中穿件一个测试类 配置pom.xml <distributionMa ...