待填坑

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. tornado-简介和原理

    tornado-设计初衷 1. 追求小而精 2. epoll IO多路复用和协程 3. 支持WebSocket 4. 单线程程序(GIL限制,本身某种意义上不启动多进程就是单线程程序) # Pytho ...

  2. STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收

    转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676

  3. C\C++中计时、延时函数

    转载:https://blog.csdn.net/keith_bb/article/details/53055380 C\C++标准库中提供了两种计时函数clock()和time().其用法如下:(1 ...

  4. BSGS算法解析

    前置芝士: 1.快速幂(用于求一个数的幂次方) 2.STL里的map(快速查找) 详解 BSGS 算法适用于解决高次同余方程 \(a^x\equiv b (mod p)\) 由费马小定理可得 x &l ...

  5. 8-kubernetes-安全

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

  6. IdentityServer 3.1.x 迁移到 4.x

    一.前言 IdentityServer4 4.x已经正式发布了,根据官方的 Release Note,3.1.x 到 4.x 的变更也是非常多,今天在将代码迁移到 4.x 遇到了一些问题在此记录下来, ...

  7. Java 集合看这一篇就够了

    大家好,这里是<齐姐聊数据结构>系列之大集合. 话不多说,直接上图: Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的: Collection 和 Map ...

  8. Springboot+JPA下实现简易爬虫:豆瓣电视剧数据

    Springboot+JPA下实现简易爬虫:豆瓣电视剧数据 前言:今天听到产品那边讨论一些需求,好像其中一点是用户要求我们爬虫,在网页上抓取一些数据然后存到我们公司数据库中,众所周知,爬虫的实现对于p ...

  9. 快速掌握ES6语法

    常量变量 let and const 先说说常量和变量的概念吧, 常量是说那种进行一次赋值后不会更改的值,比如说游戏账户的 ID, 变量是说赋值后有更改的需求的,比如游戏名,游戏密码. 在之前的 Ja ...

  10. pytest框架: fixture之conftest.py

    原文地址:https://blog.csdn.net/BearStarX/article/details/101000516 一.fixture优势1.fixture相对于setup和teardown ...