ICPC Asia Shenyang 2019 Dudu's maze
- 2019 年 10 月 4 日
- 笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41603898/article/details/100893774
这两次被dfs上了两课。
hhh
题意: 一个迷宫有n个房间,m条路,房间除了糖果就是怪物。小明从1号房间出发,他足够聪明且知道地图,遇到怪物必须使用
传送门,传送门会将你传送到和当前房间连接的任意一间(每边等概率,有重边)。不过传送门只能使用一次。问最大的糖果期望。
解:dfs
#include <bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1e5+5; vector<int> to[maxn]; int pos[maxn],fa[maxn]; bool vis[maxn]; bool book[maxn]; int n,m,k; int cnt; double ans,mx,num; void init() { for(int i=0;i<=n;i++){ to[i].clear(); vis[i] = false; book[i] = false; fa[i] = 0; } } void dfs1(int u){ book[u] = 1; if(vis[u]){ pos[++cnt] = u; return ; } ans++; for(int i=0;i<to[u].size();i++){ int nx = to[u][i]; if(book[nx])continue; dfs1(nx); } } void dfs2(int u,int pos){ if(book[u] || vis[u]) return; fa[u] = pos; num++; for(int i=0;i<to[u].size();i++){ int nx = to[u][i]; if(fa[nx]==pos)continue; dfs2(nx,pos); } } int main() { int _; scanf("%d",&_); while(_--){ init(); scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=m;i++){ int u,v; scanf("%d %d",&u,&v); to[u].push_back(v); to[v].push_back(u); } ans = 0; cnt = 0; mx = 0; for(int i=1;i<=k;i++){ int tp; scanf("%d",&tp); vis[tp] = true; } dfs1(1); int v=0; for(int i=1;i<=cnt;i++){ num =0; for(int j=0;j<to[pos[i]].size();j++){ dfs2(to[pos[i]][j],++v); } mx = max(mx,num/to[pos[i]].size()); } printf("%.6lfn",ans+mx); } return 0; }