潜行世界

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
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=0;bool flag=false;doch=getchar(),flag=(ch=='-')?true:flag;while(ch<'0'||ch>'9');do x=x*10+ch-'0';while (ch=getchar(),ch<='9' && ch>='0');return x*(flag?-1:1);
}int n,m;
struct Edge
{int np,val;Edge *next;
}E[MAXN],*V[MAXV];
int tope=-1;
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][3];
bool vis[MAXN];
queue<int> Q;
int seq[MAXN],tops=-1;
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=0;i<m;i++){scanf("%d%d%d",&x,&y,&z);totw[x]+=z;addedge(x,y,z);dego[x]++;degi[y]++;el[i][0]=x;el[i][1]=y;el[i][2]=z;}memset(vis,0,sizeof(vis));for (i=0;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[0]=1;for (i=0;i<=tops;i++){now=seq[i];for (ne=V[now];ne;ne=ne->next){poss[ne->np]+=poss[now]*ne->val/totw[now];}}tope=-1;memset(V,0,sizeof(V));memset(vis,0,sizeof(vis));for (i=0;i<n;i++)g[i]=1e100;for (i=0;i<m;i++){addedge(el[i][1],el[i][0],el[i][2]);}for (i=0;i<n;i++){if (!dego[i]){vis[i]=true;Q.push(i);g[i]=0;}}tops=-1;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,0,sizeof(V));tope=-1;for (i=0;i<m;i++){addedge(el[i][0],el[i][1],el[i][2]);}for (i=0;i<=tops;i++){now=seq[i];if (!g[now])continue;g[now]=0;for (ne=V[now];ne;ne=ne->next){g[now]+=g[ne->np]*ne->val/totw[now];}g[now]+=1;}
//        for (i=0;i<n;i++)printf("%lf ",g[i]);double delta=-1e100;double t;double gn;for (i=0;i<m;i++){if (totw[el[i][0]]==el[i][2]){gn=0;}elsegn=(g[el[i][0]]-(g[el[i][1]]+1)*el[i][2]/totw[el[i][0]])*totw[el[i][0]]/(totw[el[i][0]]-el[i][2]);delta=max((gn-g[el[i][0]])*poss[el[i][0]],delta);}delta=max(0.0,delta);printf("%.6lf ",g[0]+delta);return 0;
}

转载于:https://www.cnblogs.com/mhy12345/p/4001120.html

Contest 20140923 潛行世界 拓撲排序,期望相关推荐

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

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

  2. 士兵排队问题(拓补排序)(附简要拓补排序思想及算法)

    题目描述 有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道"1 比2 高,7 比 5高"这样的 ...

  3. 奖金(拓补排序的应用)

    谁应该高谁的入度++,并记录下谁比低的高(低的得出度),所以入度为零的就是最低的(好不公平),找出所有最低的,将他们算作一层,奖金++(算是拓补排序吧) #include<cstdio> ...

  4. HDU4324 - Triangle LOVE 拓补排序

    HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include < ...

  5. leetcode *210. 课程表 II(拓补排序)(2020.5.17)

    [题目]*210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们 ...

  6. 51nod-生产口罩(拓补排序+DP)by zyz

    题目:生产口罩 链接:http://class.51nod.com/Classes/Problem.html#courseProblemId=1718&classId=129 //注:题目来自 ...

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

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

  8. Aov网络与拓补排序的实现

    测试的节点分布如下: 测试代码如下: /** 拓补排序的实现,使用邻接链表存储有向图 */ #include <iostream> #include <cstdio> #inc ...

  9. pandas使用read_csv函数读取csv数据、sort_index函数基于多层行索引对数据排序(设置ascending参数列表指定不同层行索引的排序方向)

    pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.sort_index函数基于多层行索引对数据排序(设置ascending ...

最新文章

  1. VUE解决微信签名,SPA微信invalid signature问题,完美处理
  2. Chrome 浏览器跨域和安全访问问题 使用 chrome的命令行标记:disable-web-security 参数联调线上数据...
  3. 手工纸盒子_不锈钢水槽如何选购,拉伸水槽与手工槽制造工艺有何区别
  4. LeetCode 278. 第一个错误的版本(二分查找)
  5. 从教科书式的失败到手术刀式的自救,李宁找回了“李宁”!
  6. php7cms框架,GitHub - itsky71/itskycms: 基于ThinkPHP框架的一个CMS系统
  7. UTF8下的中文截取
  8. windows server 2003 32位支持8G内存
  9. [Python3] 面向对象编程
  10. cs229线性回归和逻辑回归总结
  11. c语言null是什么意思,c语言null什么意思?
  12. linux如何卸载lightdm,告诉你Ubuntu安装LightDM的方法及命令
  13. ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议
  14. 2021湖南省计算机类考研
  15. 如何对需求进行排序?
  16. 关于餐厅选址,这10种店铺千万别选!
  17. PIC16F887 单片机 电压检测
  18. java.lang.IllegalArgumentException: Illegal pattern character 'Y' 解决办法
  19. 质量品质征文《质 量 是 一 种 态 度》
  20. 对“超图学习”相关优势及适用范围的学习及整理

热门文章

  1. sql2005 外围应用配置器:计算机 localhost 在网络上不存在,或无法远程配置该计算机……
  2. Linux终端模式常用软件
  3. VSCode通过SSH远程连接CentOS主机的问题解决记录
  4. 洛谷P3003 苹果交货Apple Delivery
  5. Mysql exits和in的区别
  6. 使用jquery获取指定id下面的div元素个数
  7. map reduce案例超详细讲解
  8. Oxylabs代理指南
  9. 劳务员报考建筑八大员报考劳务员建筑劳务企业管理的三大问题
  10. BLAS加载错误,...出现问题,找不到指定模块。