待填坑

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. Leetcode-哈希表

    136. 只出现一次的数字 https://leetcode-cn.com/problems/single-number/ 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找 ...

  2. Copy As HTML From VSCode

    JS生成可自定义语法高亮HTMLcode cnblogs @ Orcim  !deprecated! 这里有更好的方案,具体看我的这篇博客博客代码高亮的另一种思路 这篇文章介绍了如何在博客里插入一段 ...

  3. makefile从入门到入门

    makefile文件是用来帮助编译和管理C++项目代码的,需要配合make命令使用.makefile里也可以执行shell操作,具备一部分.sh脚本的功能. makefile格式 makefile内容 ...

  4. 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法

    065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  5. 怎么写一个Activity

    a.新建一个类继承Actitvity b.重写oncreate方法 setContentView(R.layout.XXX);//设置布局文件 c.注册activity <activity an ...

  6. CRF基础知识以及如何实现Learning,Inference

    CRF:Conditional Random Field,即条件随机场. 首先介绍一下基础背景知识.机器学习中的分类问题可以分为硬分类和软分类.硬分类常见的模型有SVM.PLA.LDA等.SVM可以称 ...

  7. 多测师讲解selenium _携程选票定位练习_高级讲师肖sir

    打开携程网 from selenium import webdriverfrom time import sleepfrom selenium.webdriver.common.keys import ...

  8. Spring Boot 系列:最新版优雅停机详解

    爱生活,爱编码,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjiankethree/cub ...

  9. 超好用的UnixLinux 命令技巧 大神为你详细解读

    1.删除一个大文件 我在生产服务器上有一个很大的200GB的日志文件需要删除.我的rm和ls命令已经崩溃,我担心这是由于巨大的磁盘IO造成的,要删除这个大文件,输入: > /path/to/fi ...

  10. vs code C语言环境搭建

    最近重温C语言,因为很多练习只是小程序,并不需要Clion和Codeblocks这样工程导向的编译软件,所以下载了vs code,并试图搜索相应的环境,在此过程中发现,网上许多vs code 的c/c ...