待填坑

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+差分)的更多相关文章

  1. [CF160D]Edges in MST

    [CF160D]Edges in MST 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le10^5)\)条边的连通图.对于图中的每条边,判断它与该图最小生成树的关系: 在该图所有的 ...

  2. 【BZOJ2238】Mst 最小生成树+LCA+堆

    [BZOJ2238]Mst Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的 ...

  3. CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3

    http://codeforces.com/problemset/problem/160/D 这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中 明显桥边 ...

  4. Codeforces 160 D. Edges in MST

    \(>Codeforces \space 160 D. Edges in MST<\) 题目大意 : 给出一张带权无向图,求对于这张图上的每一条边,其是必然存在于每一种最小生成树中,还是至 ...

  5. [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)

    1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 802  Solved: 344[Submit][Sta ...

  6. NOIP2015 运输计划(二分+LCA+差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status] ...

  7. Codeforces 160D Edges in MST tarjan找桥

    Edges in MST 在用克鲁斯卡尔求MST的时候, 每个权值的边分为一类, 然后将每类的图建出来, 那些桥就是必须有的, 不是桥就不是必须有. #include<bits/stdc++.h ...

  8. MST最小生成树

    首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...

  9. 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

    [BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...

随机推荐

  1. Webpack + VueJS 学习、跳坑和总结

    这篇随笔会陆续地更新下去,用于汇集一些关于Webpack的初学跳坑总结还有VueJS的基础知识. Webpack部分 ① 快速建立一个Webpack-Vue项目开发环境(4.39.1-2019/08/ ...

  2. SPI应用 用SPI总线读取气压传感器SCP1000的数据

    Using SPI to read a Barometric Pressure Sensor This example shows how to use the SPI (Serial Periphe ...

  3. Java中的对象都是在堆上分配的吗?

    作者:LittleMagic https://www.jianshu.com/p/8377e09971b8 为了防止歧义,可以换个说法: Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定 ...

  4. Centos下Oracle11gR2安装教程与自动化配置脚本

    系统环境准备 开发组件与依赖库安装 安装centos时选择Server with GUI,右面的可以不勾选,后面统一来装 配置本地yum源 以上包如果缺乏可配置本地yum源进行安装 sudo moun ...

  5. 8-kubernetes-安全

    kubernetes安全框架 访问K8S集群的资源需要过三关:认证.鉴权.准入控制,任意一个不通过都会失败 普通用户若要安全访问集群API server,往往需要证书.token或者用户名+密码,po ...

  6. Redis使用RDB持久化和AOF持久化的区别 - 小白之所见

  7. RHSA-2017:3075-重要: wget 安全更新(代码执行)

    [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...

  8. if-else和if if的对比

  9. 远程IO

    远程io 远程io ZLAN6842,ZLAN6844是8路远程O控制器.含有8路DI.8路DO,8路AI输入.其中DI支持干节点和湿节点,带光耦隔离:DO为继电器输出,具有5A 250VAC或5A ...

  10. 安装JDK及环境变量配置

    1.下载JDK: 下载地址:https://www.oracle.com/technetwork/java/javase/overview/index.html 2.解压,运行安装包,下一步,选择安装 ...