牛客练习赛32-D-MST+tarjin割边
链接:https://ac.nowcoder.com/acm/contest/272/D
来源:牛客网
题目描述
游乐场可以看做是一张n个点,m条道路的图,每条道路有边权wi,表示第一次经过该道路时的花费(第二次及以后经过时花费为0)。
现在,小p要去找他的朋友,但他的朋友行踪很诡异,小p总是要遍历完这n个点才能找到他,同时小p希望总花费最小。
找到朋友的方案可能不唯一(具体看样例解释),小p想知道在这所有的方案中,有多少条边在每个方案中都会被经过。
输入描述:
第一行两个整数n, m. p,分别表示点数,边数,小p的初始位置。
接下来m行,每行两个整数u, v, w表示从u到v有一条无向边,边权为w。
输出描述:
输出一个整数k,表示必须经过的边的数量。
连通图没怎么学过很伤= =
看了很久这个题解大概明白了思路,按照kruskal的方法,按照相同的w分类来讨论哪些边是必不可少的,如果在当前的图中e是割边,
就说明付出w的代价使得图的连通性增强了1,显然这条边必不可少。如果不是割边,无论他会不会使得连通性增加我们都不必考虑。
譬如w1<w2<w3在进行w2轮次时,如果两个端点已经联通这条边显然没必要,如果未联通且是割边,那他就是必不可少的边。因为按照
贪心的思想必须这么做。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int root,sum=,dfn[maxn],low[maxn],ans[maxn],f[maxn];
int getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
struct Ed{
int u,v,w;
bool operator<(const Ed &A)const{
return w<A.w;
}
}E[maxn];
struct Edge{int v,id,next;}e[maxn*];
int first[maxn],tot;
void add(int u,int v,int id){
e[tot].v=v;
e[tot].id=id;
e[tot].next=first[u];
first[u]=tot++;
}
void tarjin(int u,int last){
dfn[u]=low[u]=sum++;
for(int i=first[u];~i;i=e[i].next){
int v=e[i].v;
if(i==(^last))continue;
if(dfn[v]){
low[u]=min(low[u],dfn[v]);
}
else{
tarjin(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])ans[e[i].id]=;
}
}
}
int main(){
int i,j,n,m,p,u,v,w;
scanf("%d%d%*d",&n,&m);
tot=;
memset(first,-,sizeof(first));
for(i=;i<=n;++i)f[i]=i;
for(i=;i<m;++i){
scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
}
sort(E,E+m);
for(i=;i<m;++i){
j=i;
while(j+<m&&E[j+].w==E[i].w)j++;
tot=;
for(int k=i;k<=j;++k){
int fu=getf(E[k].u),fv=getf(E[k].v);
if(fu!=fv){
add(fu,fv,k);
add(fv,fu,k);
}
}
for(int k=i;k<=j;++k){
int fu=getf(E[k].u),fv=getf(E[k].v);
if(fu==fv || dfn[fu]) continue;
tarjin(fu,-);
}
for(int k=i;k<=j;++k){
int fu=getf(E[k].u),fv=getf(E[k].v);
if(fu==fv)continue;
first[fu]=first[fv]=-;
dfn[fu]=dfn[fv]=;
f[fu]=fv;
}
i=j;
}
int h=;
for(i=;i<m;++i)h+=ans[i];
cout<<h<<endl;
return ;
}
牛客练习赛32-D-MST+tarjin割边的更多相关文章
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 牛客练习赛32 B题 Xor Path
链接:https://ac.nowcoder.com/acm/contest/272/B来源:牛客网 题目描述 给定一棵n个点的树,每个点有权值.定义表示 到 的最短路径上,所有点的点权异或和. ...
- 牛客练习赛32 A/B/C
https://ac.nowcoder.com/acm/contest/272/A v<=k时 答案就是k个1 否则贪心的从中间向两边添加1 #include<bits/stdc++.h ...
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A
牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...
- 最小生成树--牛客练习赛43-C
牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
- 牛客练习赛26:D-xor序列(线性基)
链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...
- [堆+贪心]牛客练习赛40-B
传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 x_i 的时间,同时完成第 i 个任务的时间不 ...
随机推荐
- (转) Let’s make an A3C: Theory
本文转自:https://jaromiru.com/2017/02/16/lets-make-an-a3c-theory/ Let’s make an A3C: Theory February 16, ...
- DownAlbum:Chrome的pinterest批量下载插件
一.DownAlbum安装 二.DownAlbum使用 点击DownAlbum图标. 选择Normal. 会出现一个加载的弹窗,等待片刻会打开一个新的窗口. 按Ctrl+S,即可保存相册所有图片. 图 ...
- Kibana——日志可视化工具
Kibana 基础入门 kibana产品介绍 Kibana :是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作.Kibana 提供搜索.查看和与存储在 Elasticsearch ...
- ETCD应用
etcd:从应用场景到实现原理的全方位解读 ETCD:A highly-available key value store for shared configuration and service d ...
- 转载:linux tar 解压命令总结
把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其 ...
- 让你的 Python 代码优雅又地道
示例代码和引用的语录都来自Raymond的演讲.这是我按我的理解整理出来的,希望你们理解起来跟我一样顺畅! 遍历一个范围内的数字 for i in [0, 1, 2, 3, 4, 5]: print ...
- python with as 的用法
with语句: 不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放. 比如文件处理,需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄 不用with语句,代 ...
- MsgWaitForMultipleObjects_测试
1.个人感觉: 1.1.MSDN中(https://msdn.microsoft.com/en-us/library/ms684242.aspx),说: “ dwWakeMask [in] The i ...
- springboot之启动方式
我们在ideal中启动springboot项目时时不需要加载Tomcat容器的,直接在启动类启动就行了,原因是springboot项目中默认包含了内置Tomcat //springboot项目必须引入 ...
- Codeforces 1038 E - Maximum Matching
E - Maximum Matching 思路: 欧拉图 定理:一个度数为奇数的点的个数小于等于2的联通图存在欧拉回路 对于这道题目的图,点的个数为4,所以最坏的情况下4个点的度数都为奇数,在这种情况 ...
