http://codeforces.com/problemset/problem/160/D

这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中

明显桥边一定存在于所有最小生成树中,然而怎么处理存在某个最小生成树的边呢?

借助kruskal算法的性质,由小到大,每次处理同一权值的边,如果边连接的点已经联通就不要管,否则那些处理的边一定存在于某最小生成树上

批量处理的思想很巧妙

#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn=2e5+5;
int first[maxn];
struct edge{
int t,ind,nxt;
}e[maxn];
int from[maxn],to[maxn],cost[maxn],index[maxn];
int sta[maxn];
int n,m,len; void addedge(int f,int t,int ind,int i){
e[i].nxt=first[f];
first[f]=i;
e[i].t=t;
e[i].ind=ind;
}
int par[maxn],num[maxn];
int fnd(int x){return par[x]==x?x:par[x]=fnd(par[x]);}
void unit(int a,int b){
if(fnd(a)==fnd(b))return;
num[fnd(b)]+=num[fnd(a)];
num[fnd(a)]=0;
par[fnd(a)]=fnd(b);
}
bool cmp(int a,int b) {return cost[a]<cost[b];} int dfn[maxn],low[maxn],cnt;
void dfs(int s,int f){
dfn[s]=low[s]=++cnt;
for(int p=first[s];p!=0;p=e[p].nxt){
int t=e[p].t;
if(p==(((f-1)^1)+1))continue;
if(dfn[t]==0){
dfs(t,p);
if(low[t]>dfn[s]){
sta[e[p].ind]=2;
}
else{
low[s]=min(low[s],low[t]);
}
}
else {
low[s]=min(low[s],dfn[t]);
}
}
} int st[maxn],tail;
void kruskal2(){
sort(index,index+m,cmp);
for(int i=0;i<m&&num[fnd(1)]<n;){
int j=i;
while(cost[index[i]]==cost[index[j]]&&j<m){j++;}
for(int k=i;k<j;k++){
int indk=index[k];
if(fnd(from[indk])!=fnd(to[indk])){
st[tail++]=indk;
sta[indk]=1;
}
}
for(int p=0;p<tail;p++){
int tp=st[p];
int f=fnd(from[tp]),t=fnd(to[tp]);
addedge(f,t,tp,++len);
addedge(t,f,tp,++len);
}
for(int p=0;p<tail;p++){
int tp=st[p];
int f=fnd(from[tp]),t=fnd(to[tp]);
dfs(f,0);
unit(f,t);
}
cnt=0;
len=0;
for(int p=0;p<tail;p++){
int tp=st[p];
int f=fnd(from[tp]),t=fnd(to[tp]);
first[f]=first[t]=0;
dfn[f]=dfn[t]=0;
} i=j;
tail=0;
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){par[i]=i;num[i]=1;} for(int i=0;i<m;i++){
scanf("%d%d%d",from+i,to+i,cost+i);
index[i]=i;
}
kruskal2(); for(int i=0;i<m;i++){
if(sta[i]==2)puts("any");
else if(sta[i]==1)puts("at least one");
else puts("none");
}
return 0;
}

  

CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3的更多相关文章

  1. Codeforces 160D Edges in MST tarjan找桥

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

  2. [CF160D]Edges in MST (最小生成树+LCA+差分)

    待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...

  3. Codeforces 160 D. Edges in MST

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

  4. [CF160D]Edges in MST

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

  5. MST最小生成树

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

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

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

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

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

  8. [poj1679]The Unique MST(最小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28207   Accepted: 10073 ...

  9. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...

随机推荐

  1. Python开发【模块】:Concurrent

    concurrent 模块 回顾: 对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效.我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据 ...

  2. IntelliJ IDEA 、PyCharm、WebStorm、PhpStorm等JetBrains公司软件 激活的License Server本地搭建教程

    一.背景 IntelliJ IDEA是JetBrains公司的一款IDE,主要用于java开发,可以编写Java.Groovy.Kotlin.Scala等语言,也可以直接做Android开发. 同系列 ...

  3. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)

    莫名其妙的编译总会报错 异常来自 HRESULT:0x80070057 (E_INVALIDARG) 未能加载程序集....... 几次删除引用然后重新引用程序集还是报错 奔溃中.... 网上搜索还真 ...

  4. 026-B树(一)

    1.内节点:非根非叶子节点,即非根的分支节点. 2.名称:B-树=B树=平衡多路查找树. 3.定义:m阶B树. (0).根节点孩子数rootChildNum范围:若没有孩子节点则孩子数为0,若有孩子则 ...

  5. Python 非递归遍历图

    class Queue: def __init__(self,max_size): self.max_size = int(max_size) self.queue = [] def put(self ...

  6. Python: 使用生成器创建新的迭代模式

    使用一个生成器函数来定义一个函数模式. def frange(start, stop, increment): x = start while x < stop: yield x x += in ...

  7. mongo增删改查封装(C#)

    Framework版本:.Net Framework 4 ConnectionUtil源码参见:https://www.cnblogs.com/threadj/p/10536273.html usin ...

  8. FlexPaper_1.2.1.swc——Flex在线显示PDF文档(使用FlexPaper)感悟

    http://www.cnblogs.com/wuhenke/archive/2010/03/16/1686885.html 想想自己先前搞PDF转SWF,然后在线浏览功能时,实在是费了不少精力.后来 ...

  9. HTTP--TCP连接

    几乎所有的 HTTP 通信都是由 TCP/IP 承载的,TCP/IP 是全球计算机及网络 设备都在使用的一种常用的分组交换网络分层协议集.客户端应用程序可以打开一 条 TCP/IP 连接,连接到可能运 ...

  10. bzoj1613 / P1353 [USACO08JAN]跑步Running

    P1353 [USACO08JAN]跑步Running 显然的dp 设$f[i][j]$表示进行到第$i$分钟时,$j$疲劳度下的最远距离,$d[i]$为第$i$分钟下能跑的距离 分类讨论 1.运动: ...