[CF160D]Edges in MST (最小生成树+LCA+差分)
待填坑
Code
//CF160D Edges in MST
//Apr,4th,2018
//树上差分+LCA+MST
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=100000+1000;
struct line
{
int s,t,w1,w,ans,no;
}e[N];
struct edge
{
int t,w,no;
};
bool cmp(line a,line b)
{
return a.w1<b.w1;
}
bool cmp2(line a,line b)
{
return a.no<b.no;
}
vector <edge> r[N];
struct mrk
{
int num,count;
};
vector <mrk> mk[N];
int n,m;
bool IsOnMST[N];
int fa[N][21],mx[N][21],d[N],mark[N];
bool visited[N];
void dfs(int now,int depth)
{
visited[now]=true;
d[now]=depth;
for(int i=1;i<=20;i++)
{
fa[now][i]=fa[fa[now][i-1]][i-1];
mx[now][i]=max(mx[now][i-1],mx[fa[now][i-1]][i-1]);
}
int to=r[now].size();
for(int i=0;i<to;i++)
if(visited[r[now][i].t]==false)
{
fa[r[now][i].t][0]=now;
mx[r[now][i].t][0]=r[now][i].w;
dfs(r[now][i].t,depth+1);
}
}
int LCA(int x,int y,int &MAX)
{
if(d[x]<d[y])
swap(x,y);
for(int i=20;i>=0;i--)
if(d[fa[x][i]]>=d[y])
{
MAX=max(MAX,mx[x][i]);
x=fa[x][i];
}
if(x==y) return x;
for(int i=20;i>=0;i--)
if(fa[x][i]!=fa[y][i])
{
MAX=max(MAX,mx[x][i]);
MAX=max(MAX,mx[y][i]);
x=fa[x][i],y=fa[y][i];
}
MAX=max(MAX,mx[x][0]);
MAX=max(MAX,mx[y][0]);
return fa[x][0];
}
int FA[N];
inline int FindFather(int x)
{
if(FA[x]==0) return x;
return FA[x]=FindFather(FA[x]);
}
void MST()
{
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++)
if(e[i].w1!=e[i-1].w1)
e[i].w=e[i-1].w+1;
else
e[i].w=e[i-1].w;
int tot=0;
for(int i=1;i<=m;i++)
{
int f1=FindFather(e[i].s),f2=FindFather(e[i].t);
if(f1!=f2)
{
FA[f1]=f2;
r[e[i].s].push_back((edge){e[i].t,e[i].w,i});
r[e[i].t].push_back((edge){e[i].s,e[i].w,i});
IsOnMST[i]=true;
tot++;
e[i].ans=2;
}
if(tot==n-1)
break;
}
}
void dfs2(int now)
{
visited[now]=true;
for(int i=0;i<int(r[now].size());i++)
if(visited[r[now][i].t]==false)
{
int stm=mark[r[now][i].w];
dfs2(r[now][i].t);
if(mark[r[now][i].w]-stm>0)
e[r[now][i].no].ans=1;
}
for(int i=0;i<int(mk[now].size());i++)
mark[mk[now][i].num]+=mk[now][i].count;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
mk[i].reserve(4),
r[i].reserve(4);
for(int i=1;i<=m;i++)
e[i].s=read(),e[i].t=read(),e[i].w1=read(),e[i].no=i; MST();
dfs(1,1); for(int i=1;i<=m;i++)
if(IsOnMST[i]==false)
{
int MAX=0,lca=LCA(e[i].s,e[i].t,MAX);
if(MAX==e[i].w)
{
e[i].ans=1;
mk[e[i].s].push_back((mrk){MAX,1});
mk[e[i].t].push_back((mrk){MAX,1});
mk[lca].push_back((mrk){MAX,-2});
}
} memset(visited,0,sizeof visited);
dfs2(1); sort(e+1,e+1+m,cmp2);
for(int i=1;i<=m;i++)
if(e[i].ans==0)
printf("none\n");
else if(e[i].ans==1)
printf("at least one\n");
else
printf("any\n");
return 0;
}
C++
[CF160D]Edges in MST (最小生成树+LCA+差分)的更多相关文章
- [CF160D]Edges in MST
[CF160D]Edges in MST 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le10^5)\)条边的连通图.对于图中的每条边,判断它与该图最小生成树的关系: 在该图所有的 ...
- 【BZOJ2238】Mst 最小生成树+LCA+堆
[BZOJ2238]Mst Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的 ...
- CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3
http://codeforces.com/problemset/problem/160/D 这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中 明显桥边 ...
- Codeforces 160 D. Edges in MST
\(>Codeforces \space 160 D. Edges in MST<\) 题目大意 : 给出一张带权无向图,求对于这张图上的每一条边,其是必然存在于每一种最小生成树中,还是至 ...
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 802 Solved: 344[Submit][Sta ...
- NOIP2015 运输计划(二分+LCA+差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 308 Solved: 208[Submit][Status] ...
- Codeforces 160D Edges in MST tarjan找桥
Edges in MST 在用克鲁斯卡尔求MST的时候, 每个权值的边分为一类, 然后将每类的图建出来, 那些桥就是必须有的, 不是桥就不是必须有. #include<bits/stdc++.h ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
随机推荐
- 64位Win7下H3C的iMC无法查看“网络拓扑”的解决方法、心路历程
64位Win7下H3C的iMC无法查看"网络拓扑"的解决方法.心路历程
- 062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用 本文知识点:二维数组应用 二维数组的声明和创建 ? 出现空指针异常 数组的名字指向数组的第 ...
- matlab中set用法
来源:https://www.cnblogs.com/sddai/p/5467500.html 1.MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值.例如,Lin ...
- Allegro PCB 转 PADS Layout
操作系统:Windows 10 x64 工具1:Allegro PCB Design XL (legacy) version 16.6-2015 工具2:PADS Layout VX.2.3 参考1: ...
- 【基础】dp系列1
序列双段最大子段和问题 (也许很水但蒟蒻刚刚学dp就来记录一下) 题目链接 题意就是求序列中的任意两段的最大子段和最大. 我们先预处理出来前缀和,方便求最大子段和. 对于每一个i都求一遍1到i的最大子 ...
- Apache账户密码加密方式介绍
一.apache密码存储格式 apache的用户密码一般会生成保存在.htpasswd文件中,保存路径由用户创建时确定,根据使用加密算法有五种保存格式: [注]:如果用户指定了保存密码的文件名,视用户 ...
- Linux系统编程 —共享内存之mmap
共享内存概念 共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备.但是它没有自带同步机制,需要配合信号量等方式来进行同步. 共享内存被创建以后,同一块物理内存被映射到了 ...
- RESTfull是什么
经常做接口测试,会看很多接口文档,那怎么识别研发的接口设计是否足够规范,是否符合一些行业标准或准则.那认识了解RESTfull,可以让我们更具有专业性.让我们对接口文档的阅.接口合理性设计识别,做到有 ...
- CentOS 7 系统的安装
1.进入安装界面 2.选择"Install CentOS 7" 3.进入欢迎界面,默认语言为"English",点击"Continue" 进 ...
- 多测师讲解rf--定位元素--高级讲师肖sir
注意点: 注意点: rfbug:rf 点击勾选一个运行就运行两个出现用例执行 注释快捷键: 改字体大小: 快捷键:显示关键字信息 (ctrl+鼠标悬浮) 注解不能空格在注解 未保存提示 定位方法 : ...