https://www.cnblogs.com/31415926535x/p/11520088.html

啊,,不在状态啊,,自闭一下午,,都错题,,然后背锅,,,明明这个简单的题,,,

这题题面不容易看懂,,大致意思是给你一张图,,然后从1节点开始可以任意的走,,

有些节点是 monster 节点,,这样的节点总共只能走一次,,其他的点有一个糖果,问最大的取得糖果的期望

解法很简单,,先求出从1可以不经过 monster 的点的个数,,也就是1的联通块,,

然后对于每一个和1联通块的 monster 的下的联通块求他的点的个数,,点权就是个数与其所有从这点出发的路径数的商,,取这样 monster 的点权最大加前面的1联通块的点数就行了,,,

#include <bits/stdc++.h>
#define aaa cout<<233<<endl;
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
// mt19937 rnd(time(0));
const int inf = 0x3f3f3f3f;//1061109567 > 1e9
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = 3.14159265358979;
const int maxn = 1e5 + 5;
const int maxm = 2e5 + 233;
const int mod = 1e9 + 7; int n, m, k;
struct edge
{
int to, nxt;
}edge[maxm << 1];
int tot, head[maxm << 1];
void init()
{
tot = 0;
memset(head, -1, sizeof head);
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].nxt = head[u];
head[u] = tot++;
}
int monster[maxn];
bool vismonster[maxn];
int fa[maxn];
inline int _find(int x)
{
if(fa[x] == x)return x;
return fa[x] = _find(fa[x]);
}
void _union(int x, int y)
{
int f1 = _find(x);
int f2 = _find(y);
if(f1 != f2)fa[f2] = f1;
}
bool vis[maxn];
int ans[maxn];
queue<int> q;
void bfs(int s)
{
while(!q.empty())q.pop();
q.push(s);
for(int i = 1; i <= n; ++i)vis[i] = false;
vis[s] = true;
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = head[u]; ~i; i = edge[i].nxt)
{
int v = edge[i].to;
if(vis[v] || _find(v) == _find(1))continue;
if(vismonster[v])
{
_union(s, v);
vis[v] = true;
continue;
}
vis[v] = true;
q.push(v);
_union(s, v);
++ans[s];
}
}
}
int main()
{
// double pp = clock();
// freopen("233.in", "r", stdin);
// freopen("233.out", "w", stdout);
// ios_base::sync_with_stdio(0);
// cin.tie(0);cout.tie(0); // int t; cin >> t;
int t; scanf("%d", &t);
while(t--)
{
// cin >> n >> m >> k;
scanf("%d%d%d", &n, &m, &k);
int u, v;
init();
for(int i = 1; i <= n; ++i)vismonster[i] = false;
for(int i = 1; i <= m; ++i)
{
// cin >> u >> v;
scanf("%d%d", &u, &v);
addedge(u, v);
addedge(v, u);
}
// for(int i = 1; i <= k; ++i)cin >> monster[i], vismonster[monster[i]] = true;
for(int i = 1; i <= k; ++i)
{
scanf("%d", &monster[i]);
vismonster[monster[i]] = true;
}
for(int i = 1; i <= n; ++i)fa[i] = i;
for(int i = 1; i <= n; ++i)ans[i] = 0;
ans[1] = 1;
bfs(1);
double ret = 0;
for(int j = 1; j <= k; ++j)
{
if(_find(monster[j]) == _find(1))
{
int sz = 0, sum = 0;
for(int i = head[monster[j]]; ~i; i = edge[i].nxt)
{
++sz;
if(vismonster[edge[i].to] || _find(edge[i].to) == _find(1))continue;
ans[edge[i].to] = 0;
bfs(edge[i].to);
sum += ans[edge[i].to] + 1;
}
// for(int l = 1; l <= n; ++l)cout << ans[l] << " ";cout << endl;
ret = max(ret, (double)sum / (double)sz);
// cout << sum << "-" << sz << "-" << ret << endl;
}
}
// cout << ret + (double)ans[1] << endl;
printf("%.6f\n", ret + (double)ans[1]); } // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
return 0;
}

今天不适合写代码,,,,

2019沈阳网络赛B.Dudu's maze的更多相关文章

  1. [2019沈阳网络赛D题]Dawn-K's water(点分治)

    题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...

  2. 2019 沈阳网络赛 Fish eating fruit

    这题看了三个月,终于过了,第一次看的时候没学树形DP,想用点分治但是不会 后来学了二次扫描,就有点想法了.... 这东西也真就玄学了吧... #include<iostream> #inc ...

  3. 【2019沈阳网络赛】G、Special necklace——自闭的物理题

    这道题让我差点怀疑自己高考没考过物理 题意中 he measures the resistance of any two endpoints of it, the resistance values ...

  4. 2019 沈阳网络赛 D Fish eating fruit ( 树形DP)

    题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i ...

  5. 2019沈阳网赛树形dp

    https://nanti.jisuanke.com/t/41403 2019沈阳网络赛D题 树形dp.一棵树,求任意两个点的距离之和.u-v和v-u算两次.两点之间的距离分为三类,模3等于0,1,2 ...

  6. 2018 ICPC 沈阳网络赛

    2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...

  7. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  8. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  9. ICPC 2019 徐州网络赛

    ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...

随机推荐

  1. Python递归函数,二分查找算法

    目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...

  2. 【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)

    题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作spl ...

  3. Lasso估计学习笔记(二)

    先看Lasso估计学习笔记(一),这篇是续的上一篇

  4. 决策树ID3原理及R语言python代码实现(西瓜书)

    决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...

  5. 操作微信-itchat库的安装

    基于pyCharm开发环境,在CMD控制台输入:pip install itchat      等待安装...... Microsoft Windows [版本 6.1.7601]版权所有 (c) 2 ...

  6. mysql像通讯录一样把中文按字母排序的sql

    select reimer from lendreimbursement_reimburserecord ORDER BY convert(reimer USING gb2312 ) asc; 是用c ...

  7. Python笔记_基础

    1.注释 # 单行注释 """ 多行注释,一般用于类说明 """ 或 ''' 多行注释 ''' 2.工作日志 # TODO 说明性文字 记录 ...

  8. Linux CentOS7 下设置tomcat 开机自启动

    网上有很多教程说是可以设置Tomcat 自启动,但是一一验证了都不行.最后找到一个方法 验证可以: 1.改rc.local   位于/etc/rc.d/文件下的rc.local   vi /etc/r ...

  9. Flink的Job启动JobManager端(源码分析)

    通过前面的文章了解到 Driver将用户代码转换成streamGraph再转换成Jobgraph后向Jobmanager端提交 JobManager启动以后会在Dispatcher.java起来RPC ...

  10. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...