Where are you

链接:

https://ac.nowcoder.com/acm/contest/272/D

来源:牛客网

题目描述

小\(p\)和他的朋友约定好去游乐场游玩,但是他们到了游乐场后却互相找不到对方了。

游乐场可以看做是一张\(n\)个点,\(m\)条道路的图,每条道路有边权\(w_i\),表示第一次经过该道路时的花费(第二次及以后经过时花费为\(0\))。

现在,小\(p\)要去找他的朋友,但他的朋友行踪很诡异,小\(p\)总是要遍历完这\(n\)个点才能找到他,同时小\(p\)希望总花费最小。

找到朋友的方案可能不唯一,小\(p\)想知道在这所有的方案中,有多少条边在每个方案中都会被经过。

输入描述:

第一行两个整数\(n\), \(m\),\(p\),分别表示点数,边数,小\(p\)的初始位置。

接下来\(m\)行,每行两个整数\(u\), \(v\), \(w\)表示从\(u\)到\(v有\)一条无向边,边权为\(w\)。

输出描述:

输出一个整数k,表示必须经过的边的数量。

说明

\(2\le n < m \le 2\times 10^5,1 \le w \le 10^6\)

保证图联通,无自环无重边


比赛的时候wa了一晚上,-8了...后来发现错误是没有判\(set\)空然后\(*s.begin()\)在\(set\)为空的时候居然是\(0\)...

正解不是很懂,想了一个\(n\log^2n\)的辣鸡做法。

思路:

先求出\(MST\),然后枚举不在\(MST\)上的边。如果这个边的两点在树上的路径中的边的权值小于等于这条边,那么树上的那条路径就是可以被取代的。

实现就是对两个点及它们的\(LCA\)打树上差分,然后\(set\)启发式合并一下就好了。


Code:

#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
const int N=2e5+10;
struct node
{
int u,v,w;
bool friend operator <(node n1,node n2){return n1.w<n2.w;}
}E[N];
int n,m,f[N],used[N],ans;
int Find(int x){return f[x]=f[x]==x?x:Find(f[x]);}
void Merge(int x,int y){f[Find(x)]=Find(y);}
int head[N],to[N<<1],Next[N<<1],edge[N<<1],cnt;
void add(int u,int v,int w)
{
to[++cnt]=v,Next[cnt]=head[u],edge[cnt]=w,head[u]=cnt;
}
void krus()
{
for(int i=1;i<=n;i++) f[i]=i;
std::sort(E+1,E+1+m);
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(Find(u)!=Find(v))
{
Merge(u,v);
used[i]=1;
add(u,v,w),add(v,u,w);
}
}
}
int F[N][20],dep[N];
void dfs1(int now,int fa)
{
for(int i=1;F[now][i-1];i++) F[now][i]=F[F[now][i-1]][i-1];
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(v!=fa)
{
F[v][0]=now;
dep[v]=dep[now]+1;
dfs1(v,now);
}
}
}
std::multiset <int > s[N];
std::vector <int > poi[N];
void dfs2(int now,int fa)
{
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(v==fa) continue;
dfs2(v,now);
if(s[v].empty()||*(s[v].begin())>edge[i]) ++ans;
if(s[now].size()<s[v].size()) std::swap(s[now],s[v]);
for(std::multiset<int>::iterator it=s[v].begin();it!=s[v].end();it++)
s[now].insert(*it);
s[v].clear();
}
for(int i=0;i<poi[now].size();i++)
{
if(poi[now][i]<0)
s[now].erase(s[now].find(-poi[now][i]));
else
s[now].insert(poi[now][i]);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) return LCA(y,x);
for(int i=18;~i;i--)
if(dep[F[x][i]]>=dep[y])
x=F[x][i];
if(x==y) return x;
for(int i=18;~i;i--)
if(F[x][i]!=F[y][i])
x=F[x][i],y=F[y][i];
return F[x][0];
}
bool cmp(int n1,int n2){return n1>n2;}
int main()
{
int p;scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
krus();
dep[1]=1;dfs1(1,1);
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(used[i]) continue;
int lca=LCA(u,v);
poi[u].push_back(w);
poi[v].push_back(w);
poi[lca].push_back(-w);
poi[lca].push_back(-w);
}
dfs2(1,1);
printf("%d\n",ans);
return 0;
}

2018.12.1

Nowcoder 练习赛 23 D Where are you 解题报告的更多相关文章

  1. 牛客练习赛 小D的剑阵 解题报告

    小D的剑阵 题意链接: https://ac.nowcoder.com/acm/contest/369/F 来源:牛客网 现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击 ...

  2. nowcoder(牛客网)OI测试赛2 解题报告

    qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...

  3. 【NOIP2015】提高组D1 解题报告

    P1978神奇的幻方 Accepted 描述 幻方是一种很神奇的 N ∗ N 矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时 ...

  4. 2014 ACM/ICPC 鞍山赛区现场赛 D&amp;I 解题报告

    鞍山现场赛结束了呢-- 我们出的是D+E+I三道题-- 吾辈AC掉的是D和I两道,趁着还记得.先在这里写一写我写的两道水题D&I的解题报告吧^_^. D题的意思呢是说星云内有一堆排成一条直线的 ...

  5. ZOJ 1093 Monkey and Banana (LIS)解题报告

    ZOJ  1093   Monkey and Banana  (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  6. poj1173 解题报告

    poj1173 解题报告2013-07-21 13:31 by 期待 ., 42 阅读, 0 评论, 收藏, 编辑 http://poj.org/problem?id=1173 发现此题资料甚少,斗胆 ...

  7. USACO Section2.3 Zero Sum 解题报告 【icedream61】

    zerosum解题报告----------------------------------------------------------------------------------------- ...

  8. Leetcode 115 Distinct Subsequences 解题报告

    Distinct Subsequences Total Accepted: 38466 Total Submissions: 143567My Submissions Question Solutio ...

  9. 解题报告 之 HDU5288 OO&#39; s Sequence

    解题报告 之 HDU5288 OO' s Sequence Description OO has got a array A of size n ,defined a function f(l,r) ...

随机推荐

  1. swift实现UItableview上拉下拉刷新模块

    最近用写个项目 发现上拉下拉刷新模块没找到合适的 so 自己写了一个 由于最近忙 教程就不写了 里面有 直接贴地址https://github.com/DaChengTechnology/DCRefr ...

  2. dubbo常见的一些面试题

    什么是Dubbo? Duubbo是一个RPC远程调用框架, 分布式服务治理框架 什么是Dubbo服务治理? 服务与服务之间会有很多个Url.依赖关系.负载均衡.容错.自动注册服务. Dubbo有哪些协 ...

  3. sql server 按月对数据表进行分区

    当某张数据表数据量较大时,我们就需要对该表进行分区处理,以下sql语句,会将数据表按月份,分为12个分区表存储数据,废话不多说,直接上脚本: use [SIT_L_TMS] --开启 XP_CMDSH ...

  4. 3.5星|《算法霸权》:AI、算法、大数据在美国的阴暗面

    算法霸权 作者在华尔街对冲基金德绍集团担任过金融工程师,后来去银行做过风险分析,再后来去做旅游网站的用户分析.后来辞职专门揭露美国社会生活背后的各种算法的阴暗面. 书中提到的算法的技术缺陷,我归纳为两 ...

  5. 如何在 Debian 9 下安装 LEMP 和 WHMCS 7.5

    WHMCS 7.5 发布了,它开始支持 PHP 7.2,这里就写个简单的教程记录一下安装方式. 1.准备工作 首先,我们需要按照 在Debian 9 / Debian 8 下使用源安装方式安装 LEM ...

  6. 拉格朗日乘子法与KKT条件 && SVM中为什么要用对偶问题

    参考链接: 拉格朗日乘子法和KKT条件 SVM为什么要从原始问题变为对偶问题来求解 为什么要用对偶问题 写在SVM之前——凸优化与对偶问题 1. 拉格朗日乘子法与KKT条件 2. SVM 为什么要从原 ...

  7. Live Archive 训练题

    7091 Height Ordering Mrs. Chambers always has her class line up in height order (shortest at the fro ...

  8. Thunder--Beta发布--美工+文案

    作业:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1366 内容: 美工:原有功能展示.新增功能展示 程序图标 欢迎页面 我的书架 ...

  9. TDGA-需求分析

    李青:绝对的技术控,团队中扮演“猪”的角色,勤干肯干,是整个团队的主心骨,课上紧跟老师的步伐,下课谨遵老师的指令,课堂效率高,他的编程格言“没有编不出来的程序,只有解决不了的bug”. 胡金辉:半两油 ...

  10. Swift-switch使用注意点

    1.swift后面的()可以省略 2.case后面的额break可以省略 3.如果想产生case穿透使用fallthrough 4.case后面可以判断多个条件","分割 5.sw ...