题意:给你一个图,判断每条边是否在最小生成树MST上,不在输出none,如果在所有MST上就输出any,在某些MST上输出at least one;

分析:首先必须知道在最小生成树上的边的权值一定是等于任意最小生成树上的某条边的权值;那么我们按边的权值排序,每次同时加入权值相等的边

如果加入这条边之后形成loop那么这条边肯定不是最小生成树上的边,因为在此次加边之前,图上边的权值肯定是小于此次加入的边的权值的,如果加入这条边之后形成环,那么肯定不是MST上的边;加完边之后,如果这条边是bridge,那么这条边肯定是any,因为这条边是连接两个连通块的最小唯一边,如果边在剩下的边肯定在某些MST上;

注意:每一个阶段加完边之后要,要求出此阶段的联通情况,然后一个联通快缩点,然后在继续,这样每条边最多被经历一次,时间是O(m);

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<stack>
using namespace std;
const int N = +;
struct node{
int v,id;
node(){}
node(int v,int id):v(v),id(id){}
};
vector<node> G[N];
int pre[N], low[N], eccno[N], dfs_clock, ecc_cnt;
stack<int> SK;
int an[N];
int num;
int vis[N];
void dfs(int u,int fa) {
pre[u] = low[u] = ++dfs_clock;
int sz = G[u].size();
bool first = true;
for (int i = ;i < sz; i++) {
int v = G[u][i].v;
if (v == fa && first) {
first = false;
continue;
}
if (pre[v] == ) {
dfs(v,u);
low[u] = min(low[u], low[v]);
if (low[v] > pre[u]) an[G[u][i].id] = ;
}else {
low[u] = min(low[u],pre[v]);
}
} } int n,m;
struct edge{
int u,v,w,id;
edge(){}
edge(int u,int v,int w, int id):u(u),v(v),w(w),id(id){}
bool operator < (const edge &p) const{
return w < p.w;
}
};
vector<edge> Eg;
int p[N];
int find(int x) {
return p[x] == x ? x : p[x] = find(p[x]);
}
int mark[N];
void build_graph(){
sort(Eg.begin(),Eg.end());
for (int i = ; i <= n; i++) p[i] = i;
memset(mark,,sizeof(mark));
for (int i = ; i < Eg.size(); i++) {
int j = i;
for (; j < Eg.size() && Eg[j].w == Eg[j+].w; j++);
for (int k = i; k <= j; k++) {
int u = Eg[k].u, v = Eg[k].v, w = Eg[k].w;
int x = find(u), y = find(v);
if (x != y) {
G[x].push_back(node(y,Eg[k].id));
G[y].push_back(node(x,Eg[k].id));
an[Eg[k].id] = ;
pre[x] = pre[y] = ;
mark[k] = x;
}
}
dfs_clock = ;
for (int k = i; k <= j; k++) {
if (mark[k] && pre[mark[k]] == ) dfs(mark[k],-);
}
for (int k = i; k <= j; k++) {
int u = Eg[k].u, v = Eg[k].v, w = Eg[k].w;
int x = find(u), y = find(v);
if (x != y) {
p[x] = y;
G[x].clear(); G[y].clear();
}
}
i = j;
} }
void solve(){
memset(an,,sizeof(an));
build_graph();
for (int i = ; i < m; i++) {
if (an[i] == ) printf("none\n");
else if (an[i] == ) printf("at least one\n");
else if (an[i] == ) printf("any\n");
}
}
int main(){
while (~scanf("%d%d",&n,&m)) {
Eg.clear();
for (int i = ; i < m; i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
Eg.push_back(edge(u,v,w,i));
}
solve();
} return ;
}

CF160D的更多相关文章

  1. [CF160D]Edges in MST

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

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

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

随机推荐

  1. innodb锁之间的兼容性判断

    检查锁与锁之间的兼容性 路径:/mysql-5.5.43/storage/innobase/lock/lock0lock.c 实现:见锁的强度比较  row 可理解为 lock 的锁模式  colum ...

  2. POJ2886 Who Gets the Most Candies? 线段树 反素数

    题意:有一群小朋友围成一个环,编号1,2,3…N.每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此.并设i为小于等于N的最大反素数,问 ...

  3. window+git+AndroidStudio+github

    1. 安装配置git 安装:需要从网上下载一个,然后进行默认安装即可.安装完成后,找到 “Git Bash”,点击: 配置: 注意:name和email 只是用来标识身份,但是一定要配置好 2. St ...

  4. BZOJ 4631 踩气球

    BZOJ上内存小了会WA.... 线段树上挂链表. #include<iostream> #include<cstdio> #include<cstring> #i ...

  5. IOS中封装一个View的思路

    一.封装一个View的思路 1.将View内部的业务逻辑(显示内容)封装到View中 2.一般情况下,View的位置应该由父控件来决定,也就是位置不应该固定死在View内部 3.至于View的宽高,根 ...

  6. USACO 2014 Open Silver Fairphoto

    这道题只是银牌组的第一题而我就写了 3K 的代码.唉. Description - 问题描述 FJ's N cows (2 <= N <= 100,000) are standing at ...

  7. 【Java】SHA加密

    package sdfg; import java.math.BigInteger; import java.security.MessageDigest; import java.security. ...

  8. replicate-do-db参数引起的MySQL复制错误及处理办法

    replicate-do-db配置在MySQL从库的my.cnf文件中,可以指定只复制哪个库的数据.但是这个参数有个问题就是主库如果在其他的schema环境下操作,其binlog不会被从库应用,从而出 ...

  9. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.6.重新配置与缷载11R2 Grid Infrastructure

    1.[root@linuxrac1 ~]# /u01/app/oraInventory/orainstRoot.sh 2.[root@linuxrac2 ~]# /u01/app/oraInvento ...

  10. library cache lock和cursor: pin S wait on X等待

    1.现象: 客户10.2.0.4 RAC环境,出现大量的library cache lock和cursor: pin S wait on X等待,经分析是由于统计信息收集僵死导致的.数据库在8点到9点 ...