bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1026 Solved: 448
[Submit][Status]
Description
一个无向连通图,顶点从1编号到N,边从1编号到M。
小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和。
现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小。
Input
第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边。 输入保证30%的数据满足N≤10,100%的数据满足2≤N≤500且是一个无向简单连通图。
Output
仅包含一个实数,表示最小的期望值,保留3位小数。
Sample Input
2 3
1 2
1 3
Sample Output
HINT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1000
#define MAXV MAXN
#define MAXE 500000
#define abs(x) ((x)>0?(x):(-(x)))
typedef long double real;
struct Edge
{
int np;
Edge *next;
}E[MAXE],*V[MAXV];
int tope=-;
void addedge(int x,int y)
{
E[++tope].next=V[x];
E[tope].np=y;
V[x]=&E[tope];
}
int deg[MAXN];
int q[MAXN];
real pp[MAXN];
real a[MAXN][MAXN];
int n,m;
struct edge
{
int x,y;
real p;
}w[MAXE];
bool cmp_p(edge e1,edge e2)
{
return e1.p>e2.p;
}
void pm()
{
for (int i=;i<n;i++)
{
for (int j=;j<=n;j++)
{
printf("%.2Lf ",a[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
freopen("input.txt","r",stdin);
int i,j,k,x,y,z;
scanf("%d%d",&n,&m);
for (i=;i<m;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
deg[x]++;deg[y]++;
w[i].x=x;w[i].y=y;
}
int now;
Edge *ne;
for (i=;i<=n-;i++)
{
now=i;
for (ne=V[now];ne;ne=ne->next)
{
if (ne->np!=n)
a[now][ne->np]=1.0/deg[ne->np];
}
a[now][now]=-;
a[now][n]=;
}
a[][n]=;
//pm();
for (i=;i<=n-;i++)
{
x=i;
for (j=i+;j<=n-;j++)
{
if (abs(a[j][i])>abs(a[x][i]))
{
x=j;
}
}
if (x!=i)
{
for (j=i;j<=n;j++)
{
swap(a[i][j],a[x][j]);
}
}
if (!a[i][i])continue;
for (j=i+;j<=n-;j++)
{
real t=a[j][i]/a[i][i];
for (k=i;k<=n;k++)
{
a[j][k]-=t*a[i][k];
}
}
//pm();
}
pp[n]=;
for (i=n-;i>=;i--)
{
for (j=i+;j<=n;j++)
{
pp[i]-=pp[j]*a[i][j];
}
pp[i]/=a[i][i];
}
pp[n]=;
/* for (i=1;i<=n;i++)
printf("%.2Lf ",pp[i]);
printf("\n");*/
for (i=;i<m;i++)
{
w[i].p=pp[w[i].x]/deg[w[i].x] + pp[w[i].y]/deg[w[i].y];
}
sort(w,w+m,cmp_p);
int head=-,tail=-;
real ans=;
for (i=;i<m;i++)
{
ans+=(i+)*w[i].p;
}
printf("%.3Lf",ans);
}
bzoj 3143: [Hnoi2013]游走 高斯消元的更多相关文章
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- Luogu3232 HNOI2013 游走 高斯消元、期望、贪心
传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...
- BZOJ3143:[HNOI2013]游走(高斯消元)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元
[Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3394 Solved: 1493[Submit][Status][Disc ...
- bzoj 3143 [Hnoi2013]游走【高斯消元+dp】
参考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有点像 设点u的经过期望(还是概率啊我也分不清,以下都分不清)为\( x[u ...
- [HNOI2013][BZOJ3143] 游走 - 高斯消元
题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边 ...
随机推荐
- Spring框架:Spring容器具体解释
Spring容器 Spring容器能够帮助你管理所有的Bean对象.专业术语称之为IoC控制反转.在传统的程序中.对象的生成都是由开发人员完毕的.而在控制反转中,对象的生成所有都交给框架完毕.这种优点 ...
- console.debug()浏览器控制台打印输出 仅仅在支持console的浏览器下打印
console.debug()浏览器控制台打印输出 仅仅在支持console的浏览器下打印 var util = {}; /** * 工具类 */ util = new function() { /* ...
- cookie记录浏览记录
cookie记录浏览记录 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做 ...
- js监听用户的键盘敲击事件,兼容各大主流浏览器
js监听用户的键盘敲击事件,兼容各大主流浏览器 <script type="text/javascript"> document.onkeydown = functio ...
- Java基础知识强化之网络编程笔记01:InetAddress类的概述和使用
1. InetAddress类 InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,Datagr ...
- pnd3
这两天重写了,消除后本身的下落计算还有问题,新产生的块下落和消除已经OK了.消除算法真的很要命.最后还是回归最开始的想法,用递归的方式不断的SPREAD来得到消除的数据.快到月底了,得勤写写了,要不找 ...
- select 中使用 case when 和 replace
在SELECT中,用CASE 例如: select a.Cname as Tcomname,b.Cname as TGoodname,D.nQuanty,c.cNote ...
- docker build lnmp(未完成。。。)
docker pull centos # 拉取镜像到本地 docker run -i -t -p 8000:80 --name=centosDev centos cat /etc/redhat-rel ...
- JVM体系结构
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/5187049.html ...
- AES加解密【示例】
代码 /** * AES算法加密.JRE默认只能用16个字节(128)位密钥 */ public class AESUtils { //使用指定转换的 Cipher 对象 publ ...