CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3
http://codeforces.com/problemset/problem/160/D
这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中
明显桥边一定存在于所有最小生成树中,然而怎么处理存在某个最小生成树的边呢?
借助kruskal算法的性质,由小到大,每次处理同一权值的边,如果边连接的点已经联通就不要管,否则那些处理的边一定存在于某最小生成树上
批量处理的思想很巧妙
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn=2e5+5;
int first[maxn];
struct edge{
int t,ind,nxt;
}e[maxn];
int from[maxn],to[maxn],cost[maxn],index[maxn];
int sta[maxn];
int n,m,len; void addedge(int f,int t,int ind,int i){
e[i].nxt=first[f];
first[f]=i;
e[i].t=t;
e[i].ind=ind;
}
int par[maxn],num[maxn];
int fnd(int x){return par[x]==x?x:par[x]=fnd(par[x]);}
void unit(int a,int b){
if(fnd(a)==fnd(b))return;
num[fnd(b)]+=num[fnd(a)];
num[fnd(a)]=0;
par[fnd(a)]=fnd(b);
}
bool cmp(int a,int b) {return cost[a]<cost[b];} int dfn[maxn],low[maxn],cnt;
void dfs(int s,int f){
dfn[s]=low[s]=++cnt;
for(int p=first[s];p!=0;p=e[p].nxt){
int t=e[p].t;
if(p==(((f-1)^1)+1))continue;
if(dfn[t]==0){
dfs(t,p);
if(low[t]>dfn[s]){
sta[e[p].ind]=2;
}
else{
low[s]=min(low[s],low[t]);
}
}
else {
low[s]=min(low[s],dfn[t]);
}
}
} int st[maxn],tail;
void kruskal2(){
sort(index,index+m,cmp);
for(int i=0;i<m&&num[fnd(1)]<n;){
int j=i;
while(cost[index[i]]==cost[index[j]]&&j<m){j++;}
for(int k=i;k<j;k++){
int indk=index[k];
if(fnd(from[indk])!=fnd(to[indk])){
st[tail++]=indk;
sta[indk]=1;
}
}
for(int p=0;p<tail;p++){
int tp=st[p];
int f=fnd(from[tp]),t=fnd(to[tp]);
addedge(f,t,tp,++len);
addedge(t,f,tp,++len);
}
for(int p=0;p<tail;p++){
int tp=st[p];
int f=fnd(from[tp]),t=fnd(to[tp]);
dfs(f,0);
unit(f,t);
}
cnt=0;
len=0;
for(int p=0;p<tail;p++){
int tp=st[p];
int f=fnd(from[tp]),t=fnd(to[tp]);
first[f]=first[t]=0;
dfn[f]=dfn[t]=0;
} i=j;
tail=0;
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){par[i]=i;num[i]=1;} for(int i=0;i<m;i++){
scanf("%d%d%d",from+i,to+i,cost+i);
index[i]=i;
}
kruskal2(); for(int i=0;i<m;i++){
if(sta[i]==2)puts("any");
else if(sta[i]==1)puts("at least one");
else puts("none");
}
return 0;
}
CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3的更多相关文章
- Codeforces 160D Edges in MST tarjan找桥
Edges in MST 在用克鲁斯卡尔求MST的时候, 每个权值的边分为一类, 然后将每类的图建出来, 那些桥就是必须有的, 不是桥就不是必须有. #include<bits/stdc++.h ...
- [CF160D]Edges in MST (最小生成树+LCA+差分)
待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...
- Codeforces 160 D. Edges in MST
\(>Codeforces \space 160 D. Edges in MST<\) 题目大意 : 给出一张带权无向图,求对于这张图上的每一条边,其是必然存在于每一种最小生成树中,还是至 ...
- [CF160D]Edges in MST
[CF160D]Edges in MST 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le10^5)\)条边的连通图.对于图中的每条边,判断它与该图最小生成树的关系: 在该图所有的 ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 802 Solved: 344[Submit][Sta ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- [poj1679]The Unique MST(最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28207 Accepted: 10073 ...
- 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树
这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...
随机推荐
- find the safest road---hdu1596(最短路模板求最大概率)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1596 求给定的任意两点之间的最大安全概率,概率之间是相乘的关系,所以注意初始化即可 #include& ...
- New Reform---cf659E(dfs找环)
题目链接:http://codeforces.com/problemset/problem/659/E 给你n个点,m条双向边,然后让你把这些边变成有向边,使得最后的图中入度为0的点的个数最少,求最少 ...
- QQ-AR助人教版小学英语“动”起来
日前,人教数字出版公司与腾讯QQ达成合作,将以小学英语3-6年级8本课本为合作试点,共同推出全国首个可AR识别的课本,在QQ-AR的帮助下,课本也能“动”起来,更加生动立体地展现在孩子眼前,让学习变得 ...
- python实现http接口自动化测试(完善版)
今天给大家分享一个简单的Python脚本,使用python进行http接口的自动化测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值 ...
- Linux(CentOS)系统下搭建svn服务器
由于GitHub的私有项目需要收费,gitlab对服务器的要求必须是4GB内存以上.对于一些个人的小型项目,想要免费的版本控制工具来管理自己的代码,又不想代码公开,无疑SVN是比较好的选择.windo ...
- JAVA正则表达式 Pattern和Matcher(转)
1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher. 首先一个Pattern实例订制了一 ...
- maven运行junit用例并生成报告
原文地址https://blog.csdn.net/hdyrz/article/details/78398964 测试类如下: [java] view plain copypackage com.mm ...
- 牛客国庆集训派对Day3 Solution
A Knight 留坑. B Tree 思路:两次树形DP,但是要考虑0没有逆元 可以用前缀后缀做 #include <bits/stdc++.h> using namespa ...
- pug 在线文档
https://pugjs.org/zh-cn/api/getting-started.html
- inline用法详解
(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...