Contest 20140923 潛行世界 拓撲排序,期望
潜行世界
- 查看
- 提交
- 统计
- 提问
- 总时间限制:
- 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 潛行世界 拓撲排序,期望相关推荐
- 【BZOJ3036】绿豆蛙的归宿 拓补排序+概率
[BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度. ...
- 士兵排队问题(拓补排序)(附简要拓补排序思想及算法)
题目描述 有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道"1 比2 高,7 比 5高"这样的 ...
- 奖金(拓补排序的应用)
谁应该高谁的入度++,并记录下谁比低的高(低的得出度),所以入度为零的就是最低的(好不公平),找出所有最低的,将他们算作一层,奖金++(算是拓补排序吧) #include<cstdio> ...
- HDU4324 - Triangle LOVE 拓补排序
HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include < ...
- leetcode *210. 课程表 II(拓补排序)(2020.5.17)
[题目]*210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们 ...
- 51nod-生产口罩(拓补排序+DP)by zyz
题目:生产口罩 链接:http://class.51nod.com/Classes/Problem.html#courseProblemId=1718&classId=129 //注:题目来自 ...
- QRowTable表格控件-支持hover整行、checked整行、指定列排序等
文章目录 一.开心一刻 二.嘴一嘴 三.效果展示 四.浅谈实现 五.自定义数据源 1.data函数 2.flags函数 六.自定义视图 1.目的 2.问题分析 七.测试 八.相关文章 原文链接: QR ...
- Aov网络与拓补排序的实现
测试的节点分布如下: 测试代码如下: /** 拓补排序的实现,使用邻接链表存储有向图 */ #include <iostream> #include <cstdio> #inc ...
- pandas使用read_csv函数读取csv数据、sort_index函数基于多层行索引对数据排序(设置ascending参数列表指定不同层行索引的排序方向)
pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.sort_index函数基于多层行索引对数据排序(设置ascending ...
最新文章
- VUE解决微信签名,SPA微信invalid signature问题,完美处理
- Chrome 浏览器跨域和安全访问问题 使用 chrome的命令行标记:disable-web-security 参数联调线上数据...
- 手工纸盒子_不锈钢水槽如何选购,拉伸水槽与手工槽制造工艺有何区别
- LeetCode 278. 第一个错误的版本(二分查找)
- 从教科书式的失败到手术刀式的自救,李宁找回了“李宁”!
- php7cms框架,GitHub - itsky71/itskycms: 基于ThinkPHP框架的一个CMS系统
- UTF8下的中文截取
- windows server 2003 32位支持8G内存
- [Python3] 面向对象编程
- cs229线性回归和逻辑回归总结
- c语言null是什么意思,c语言null什么意思?
- linux如何卸载lightdm,告诉你Ubuntu安装LightDM的方法及命令
- ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议
- 2021湖南省计算机类考研
- 如何对需求进行排序?
- 关于餐厅选址,这10种店铺千万别选!
- PIC16F887 单片机 电压检测
- java.lang.IllegalArgumentException: Illegal pattern character 'Y' 解决办法
- 质量品质征文《质 量 是 一 种 态 度》
- 对“超图学习”相关优势及适用范围的学习及整理