题意:给你一个图,判断每条边是否在最小生成树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. 盒模型padding和margin对滚动条位置的影响

    前置条件:盒模型样式overflow-y:scroll; ①padding-right:15px的效果: padding对于滚动条的位置显然是没有影响的,这也不是我们要的结果(这样很难看!) ②mar ...

  2. UVa 1609 (博弈) Foul Play

    姑且把它归类为一道博弈吧,毕竟这也是在找必胜方案. 十分有意思的一道题目,设计一种方案让你支持的1队获胜. 题目给出了两个很重要的条件: 1队能打败至少一半的队伍 对于1队不能打败的黑队,一定存在一个 ...

  3. UVa 10020 (最小区间覆盖) Minimal coverage

    题意: 数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖一条指定线段[0, m] 算法: [start, end]为已经覆盖到的区间 这是一道贪心 把各个区间先按照左端点从小到大排序,更新st ...

  4. 浅谈网络爬虫爬js动态加载网页(二)

    没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的. 继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个 ...

  5. wince6下载地址

    http://geekswithblogs.net/WindowsEmbeddedCookbook/archive/2010/08/31/installing-windows-ce-6.0-tools ...

  6. IE 火狐浏览器对时间格式的兼容性;使用原型对象的方式 prototype关键字;时间格式化

    在ie中 时间格式如果用横杠来显示  "2013-05-10 19:20:59" 是可以正确识别的(如果用斜杠,IE也可以正确识别), 但是如果是火狐,则只能识别斜杠模式 &quo ...

  7. VPS技术介绍以及分析

    VPS的全称为Virtual Private Server,叫做虚拟专用服务器(Godaddy称之为Virtual Dedicated Server,VDS).就是利用各种虚拟化手段把单台物理服务器虚 ...

  8. yii2.0 事务

    $transaction=\Yii::$app->db->beginTransaction(); $model=Customer::findOne(1); $model->name= ...

  9. Android 图文教学让你彻底理解activity启动模式

    我们首先从最简单的开始, standard 这个模式就是默认的模式,我们都知道 当你用这个模式时,每次发送一个intent,都会生成一个新的实例! 我写一个简单的例子: <?xml versio ...

  10. C# Math.Round中国式的四舍五入法

    double dou = 1.255; //这种是错误的 double dou_result = Math.Round(dou, 2); //结果: 1.25 dou_result = Math.Ro ...