待填坑

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. Python-判断字符串是否以某个字符串开头或结尾?

    案例: 某文件系统目录下有一系列文件: 1.c 2.py 3.java 4.sh 5.cpp ...... 编写一个程序,给其中所有的.sh文件和.py文件加上可执行权限 如何解决这个问题? 1. 先 ...

  2. 03 . Docker数据资源管理与网络

    Docker数据卷 在容器中管理数据主要有两种方式 # 数据卷(Data volumes) # 数据卷容器(Data volume containers) # 数据卷是一个可供一个或多个容器使用的特殊 ...

  3. Java知识系统回顾整理01基础01第一个程序02命令行格式编译和执行Java程序

    一.先看运行效果 在控制台下运行第一个Java程序,可以看到输出了字符串 hello world 二.准备项目目录 通常都会在e: 创建一个project目录 在这个例子里,我们用的是e:/proje ...

  4. Java知识系统回顾整理01基础03变量01变量定义

    定义: 变量:用来命名一个数据的标识符 一.什么是变量? 用具体实例定义变量 变量的定义是: 用来命名一个数据的标识符 1949 这是一个数字,代表某年 如果要命名这个数字,在java里就会写成: i ...

  5. 带有Firebase的离子2:在OAuth 2中签名

    介绍 这是一个指南,展示如何在Android上使用Firebase认证谷歌用户. 背景 虽然很多人都写过这个指南,但是他们没有解释一个关键的部分--为什么在执行了每一步之后仍然会看到认证错误12501 ...

  6. OracleOggan安装并测试同步数据步骤!

    Oracle Golden Gate (ogg)安装使用说明 Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉.变换.投递等功能. OGG支持的异构环境有: OGG的特性: ①对生 ...

  7. 实验 5:OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接:通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...

  8. 多测师全方位面试题腾讯 _自动化面试题_高级讲师肖sir

    作答注意:候选人可以两题都做,也可以两题任选一题做即可. 笔试题一:1.查询 https://www.newsmth.net/nForum/#!board/PieLove2.获取发贴时间是2020年8 ...

  9. MeteoInfoLab脚本示例:多坐标系

    绘图的时候首先要有坐标系(Axes),可以用axes命令创建,如果没有创建在绘图时会自动创建一个.参数里的position是用来置顶坐标系的图形(figure)中的位置的,通过位置置顶,可以将多个坐标 ...

  10. MeteoInfoLab脚本示例:水汽通量散度计算

    用ncep数据计算水汽通量散度的脚本.需要air, uwnd, vwnd和rhum变量.数据是4维数据,需要固定时间维和高度维,数据中纬度维的数据是反向的,因此读取时需要特殊的设置(::-1).脚本中 ...