【问题描述】
在古代阿拉伯王国,有 n 座城市由 n-1 条道路,每条道路连接两座城市,人们可以从任意城市出发到达另外一座城市。
西蒙住在第一个城市,骑着马沿着马路去旅行,但是这个国家非常多雾,他也看不清楚马把他带向了哪里,当他们到达一个城市时(包括第一个城市),接下来可以去往与该城市相连的任意一个城市,然而他的马有些奇特,就是只会去往以前从未到达过的城市,且对于下一个城市的选择是等概率的,直到没有可以去往的城市为止。
设每条道路的长度为1,从第一个城市开始旅行,那么这次旅行的期望长度(旅行距离的期望值)的多少?
如果你对期望值(平局值)的定义不太了解,可以查阅相关资料。
【输入形式】
输入的第一行为一个整数 n (1≤ n ≤100000),表示城市的数量。
接下来的 n-1 行,每行包含两个整数 ui 和 vi (1 ≤ ui ,vi ≤ n , ui ≠ vi),表示由第 i 条道路连接的城市。
输入保证能从一个城市到达其他任意一个城市。
【输出形式】
输出一个数,表示此次旅行的距离的期望值,旅行从城市1开始。
答案的绝对或相对误差不能超过10-6,也就是说,如果你的答案为 a,正确答案为 b ,则如果
则检查程序会认为你的答案是正确的。
【样例输入1】
4 1 2 1 3 2 4
【样例输出1】
1.500000000000000
【样例输入2】
5 1 2 1 3 3 4 2 5
【样例输出2】
2.000000000000000
【样例说明】
在第一个样例中,旅行可以在等概率在城市3或4结束,城市3的距离为1而城市4的距离为2,因此,期望长度为1.5.
在第二个样例中,旅行可以在城市4或5结束,两个距离都是2,因此期望长度为2。
来源:839C
#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 100001
#define STARTCITY 1
typedef struct
{
int citynum;
pair<int, int> routine[MAXSIZE];
} Arabmap;
Arabmap m;
bool visited[MAXSIZE];
int leaves[MAXSIZE];
double rates[MAXSIZE];
int p=0;
void FindNearCities(vector<int> &v, int city) {
for (int i=0; i<m.citynum-1; i++) {
if (m.routine[i].first==city) v.push_back(m.routine[i].second);
if (m.routine[i].second==city) v.push_back(m.routine[i].first);
}
}
void DFS(int nowcity, int length, double rate) {//length show how long you have walk
visited[nowcity]=1; length++;
vector<int> neighbors;
FindNearCities(neighbors, nowcity);
int size=(int)neighbors.size();
if (size==1&&nowcity!=STARTCITY) {//if nowcity is a leaf
leaves[p]=length; rates[p]=rate;
p++;
return;
}
//nowcity is not a leaf
int childnum;
for (int i=0; i<size; i++) {
if (nowcity==STARTCITY) childnum=size;
else childnum=size-1;
if (!visited[neighbors[i]]) DFS(neighbors[i], length, rate/childnum);
}
}
int main() {
cin>>m.citynum;
for (int i=0; i<m.citynum-1; i++) cin>>m.routine[i].first>>m.routine[i].second;
//you have input infomation to create a map
DFS(STARTCITY, -1, 1);
double E=0; p=0;
while (leaves[p]) {
E+=leaves[p]*rates[p];
p++;
}
printf("%.7lf", E);//accuicy is less than 10^-6, so you should print the result for 7 bits
return 0;
}