绿豆蛙的归宿(Java)
Description
随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。
给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
Input
第一行: 两个整数 N M,代表图中有N个点、M条边
第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边
Output
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
Sample Input
4 4
1 2 1
1 3 2
2 3 3
3 4 4
Sample Output
7.00
HINT
对于20%的数据 N<=100
对于40%的数据 N<=1000
对于60%的数据 N<=10000
对于100%的数据 N<=100000,M<=2*N
Source
Nescafe 19
1 package main; 2 import java.util.Scanner; 3 import java.util.*; 4 public class Main { 5 class Point{ 6 Set<Point> in=new HashSet(); 7 Set<Point> out=new HashSet(); 8 Set<Edge> ein=new HashSet(); 9 Set<Edge> eout=new HashSet(); 10 float pin=0; 11 Point(){}; 12 } 13 class Edge{ 14 Point start; 15 Point end; 16 float length=0; 17 float expen=0; 18 Edge(Point st,Point en,float l){ 19 start=st; 20 end=en; 21 length=l; 22 } 23 } 24 public static void main(String[] args){ 25 int N; 26 int M; 27 Scanner sc=new Scanner(System.in); 28 N=sc.nextInt(); 29 M=sc.nextInt(); 30 Point[] point=new Point[N]; 31 Main m=new Main(); 32 for(int i=0;i<N;i++) point[i]=m.new Point(); 33 point[0].pin=1; 34 Edge[] edge=new Edge[M]; 35 for(int i=0;i<M;i++){ 36 int a=sc.nextInt(); 37 int b=sc.nextInt(); 38 float c=sc.nextInt(); 39 edge[i]=m.new Edge(point[a-1],point[b-1],c); 40 } 41 sc.close(); 42 long startTime = System.currentTimeMillis(); 43 for (Edge e:edge){ 44 e.start.eout.add(e); 45 e.end.ein.add(e); 46 e.start.out.add(e.end); 47 e.end.in.add(e.start); 48 } 49 bianli(point[0]); 50 float sum =0; 51 for(Edge e:edge){ 52 sum +=e.length*e.expen; 53 } 54 System.out.println(sum); 55 long endTime = System.currentTimeMillis(); 56 //System.out.println("Java程序运行时间为:"+(endTime-startTime)+"ms"); 57 //System.out.println("最终期望为"+sum); 58 } 59 private static void bianli(Point a){ 60 for(Edge e:a.eout){ 61 e.expen+=a.pin/a.eout.size(); 62 e.end.pin=a.pin/a.eout.size(); 63 bianli(e.end); 64 //System.out.println(e.length+","+e.end.pin); 65 } 66 } 67 }