开坑督促自己补题,orz
结束之后再看C题,其实大体意思我还是懂的,方法也明白,就是一些细节问题可能把握不好。
嗯,我决定以后这种我能看懂的题目就自己先凭着记忆和感觉好好敲一遍再看大神的题解,呼呼。
#include<iostream>
using namespace std;
#include<vector>
#include<string.h>
int n;//n个城市
vector<int>node[100005];
int vis[100005];
double ans;
void dfs(int step, int pos, double possible)
{
int trueson = 0;
int i;
vis[pos] = 1;
for (i = 0; i < node[pos].size(); i++)
if (!vis[node[pos][i]])
trueson++;
if (trueson == 0)
{
ans += step*possible;
return;
}
for (i = 0; i < node[pos].size(); i++)
{
if (!vis[node[pos][i]])
pos==1?dfs(step + 1, node[pos][i],possible*1.0 / node[pos].size()): dfs(step + 1, node[pos][i], possible*1.0 / (node[pos].size()-1));
}
}
int main()
{
while (cin >> n)
{
ans = 0;
memset(vis, 0, sizeof(vis));
int i;
for (i = 1; i <= n; i++)
node[i].clear();
for (i = 1; i <= n - 1; i++)
{
int u, v;
cin >> u >> v;
node[u].push_back(v);
node[v].push_back(u);
}
dfs(0, 1, 1);
printf("%.12f\n", ans);
}
return 0;
}
这是AC的代码,我觉得用的是最通俗易懂的人类思想做的。
#include<iostream>
using namespace std;
#include<vector>
#include<string.h>
int n;//n个城市
vector<int>node[100005];
int vis[100005];
int ans = 0;
void dfs(int step, int pos,int possible)
//这个地方不错,dfs的三个变量都找对了,但是第三个变量应该用double
{
int trueson = 0;
int i;
for (i = 0; i < node[pos].size(); i++)
if (!vis[node[pos][i]])
trueson++;
if (trueson == 0)
ans += step*possible;
//大失误:忘记写return,dfs中非常重要的一部分就是return
for (i = 0; i < node[pos].size(); i++)
{
if (!vis[node[pos][i]])
dfs(step + 1, node[pos][i], 1 / trueson);
//这个地方是什么鬼,第三个变量中的possible是需要上面的累积的,而且应该是1.0而且/的是size而不是trueson,而且这个地方有个问题,1的地位和其他的地方的地位是不一样的,详情见AC代码。
}
}
int main()
{
while (cin >> n)
{
memset(vis, 0, sizeof(vis));
int i;
for (i = 1; i <= n; i++)
node[i].clear();
for (i = 1; i <= n - 1; i++)
{
int u, v;
cin >> u >> v;
node[u].push_back(v);
node[v].push_back(u);
}
dfs(1, 1,1);
//第一个变量应该是0
cout << ans << endl;
//输出格式有问题,人家后面那么多小数点呢好吧!
}
return 0;
}
这是我的第一版纯自敲代码,一会儿将对它进行全面而彻底的批判。
批判结束!