题意:给你一个图,判断每条边是否在最小生成树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. JSAPI微信支付返回错误:fail_no permission to execute

    问题描述 fail_no permission to execute 一定是授权目录出问题了,因为没有权限. 开发环境及可能造成的原因 这次的微信开发是用的Mvc4,支付的封装代码不会有问题(用过很多 ...

  2. codeforces 432 B Football Kit

    题意:给出n支球队,主场的衣服的颜色x[i],客场的衣服的颜色y[i],每只队伍会打n-1次主场,n-1次客场,当这只队伍打客场的衣服颜色和对手一样的时候,那么他们要穿上主场的衣服 问每个球队主场球服 ...

  3. 作业调度框架 Quartz.NET 2.0 StepByStep

    注:目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写 ...

  4. HDU 5269 ZYB loves Xor I (二分法)

    题意: 给出一个序列,对每两个数求异或结果后取最低位的1出来作为一个数,然后求这些数字的和.比如:{a,b,c},结果是lowbit(a^b)+lowbit(a^c)+lowbit(b^a)+lowb ...

  5. 【C#学习笔记】改变字体

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 【自动化测试】Selenium - 定位

    http://easonhan007.github.io/selenium/2014/01/10/se-secret_01/ 你应该遵照这个规则来选择定位元素的属性.name > id > ...

  7. Oracle 单实例 迁移到 RAC 实例 -- 使用RMAN 异机恢复

    Oracle 官网有关单实例迁移到RAC的一个步骤说明: How to Convert 10g Single-Instance database to 10g RAC using Manual Con ...

  8. MySQL与Oracle 差异比较之一数据类型

    数据类型 编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型:MYSQL ...

  9. C# 类的多态、结构、接口、抽象、虚函数总结

    多态: 类的多态是通过在子类(派生类)中重载基类的虚方法或成员函数来实现的. 可见,重载和虚函数的重写,并在调用时用父类装箱子类对象,是实现多态的一种重要的编程方式. 接口: 接口是一种用来定义程序的 ...

  10. [转] 从 dll 程序集中动态加载窗体

    无涯 原文 从 dll 程序集中动态加载窗体 [原创] 昨天晚上花了一晚上时间写了一个从程序集中动态加载窗体的程序.将任何包含窗体的代码编译成 dll 文件,再把 dll 文件拷贝到本程序的目录下,本 ...