D. Edges in MST 图论
http://codeforces.com/contest/160/problem/D
base on 克鲁斯卡尔,
首先每次都是对权值相同的边进行统一处理,假如加入了当前这条边出现了回路,那就能确定这条边是none的。
否则,让它加入进图,(先不合并),然后找到这个图的桥,那些就是any的,其他都是at least one的。
唯一要注意的就是不能像克鲁斯卡尔这样,没加入一条边,都合并。这里是把权值相同的边加入来后,再统一合并。
4 4
1 2 1
2 3 1
3 4 2
1 3 2
any
any
any
none
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 1e5 + ;
int first[maxn], num;
struct Edge {
int u, v, w, id, tonext;
}e[maxn * ];
void addEdge(int u, int v, int w, int id) {
e[num].u = u, e[num].v = v, e[num].w = w, e[num].id = id, e[num].tonext = first[u];
first[u] = num++;
}
struct Node {
int u, v, w, id;
}data[maxn];
bool cmp1(struct Node a, struct Node b) {
return a.w < b.w;
}
int fa[maxn];
int tofind(int x) {
if (fa[x] == x) return x;
else return fa[x] = tofind(fa[x]);
}
char ans[][] = {"none", "any", "at least one"};
int res[maxn], in[maxn];
int DFN[maxn], low[maxn], when, vis[maxn];
void dfs(int cur, int fromID) {
DFN[cur] = low[cur] = ++when;
for (int i = first[cur]; ~i; i = e[i].tonext) {
int v = e[i].v;
if (e[i].id == fromID) continue;
vis[e[i].id] = true;
if (!DFN[v]) {
dfs(v, e[i].id);
low[cur] = min(low[cur], low[v]);
if (low[v] > DFN[cur]) {
res[e[i].id] = ;
}
} else low[cur] = min(low[cur], DFN[v]);
}
}
void work() {
num = ;
memset(first, -, sizeof first);
for (int i = ; i <= maxn - ; ++i) fa[i] = i;
int n, m;
cin >> n >> m;
for (int i = ; i <= m; ++i) {
cin >> data[i].u >> data[i].v >> data[i].w;
data[i].id = i;
}
sort(data + , data + + m, cmp1);
for (int i = ; i <= m;) {
int en;
for (en = i + ; en <= m && data[en].w == data[i].w; ++en);
for (int j = i; j < en; ++j) {
int x = tofind(data[j].u), y = tofind(data[j].v);
if (x == y) continue;
addEdge(x, y, data[j].w, data[j].id);
addEdge(y, x, data[j].w, data[j].id);
res[data[j].id] = ;
in[data[j].id] = true;
}
for (int j = i; j < en; ++j) {
if (vis[data[j].id] || !in[data[j].id]) continue;
vis[data[j].id] = true;
dfs(tofind(data[j].u), -);
}
for (int j = i; j < en; ++j) {
int x = tofind(data[j].u), y = tofind(data[j].v);
if (x != y) {
fa[y] = x;
first[x] = first[y] = -;
DFN[x] = DFN[y] = low[x] = low[y] = false;
when = ;
}
}
i = en;
}
for (int i = ; i <= m; ++i) {
cout << ans[res[i]] << endl;
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
IOS;
work();
return ;
}
D. Edges in MST 图论的更多相关文章
- Codeforces 160D Edges in MST tarjan找桥
Edges in MST 在用克鲁斯卡尔求MST的时候, 每个权值的边分为一类, 然后将每类的图建出来, 那些桥就是必须有的, 不是桥就不是必须有. #include<bits/stdc++.h ...
- Codeforces 160 D. Edges in MST
\(>Codeforces \space 160 D. Edges in MST<\) 题目大意 : 给出一张带权无向图,求对于这张图上的每一条边,其是必然存在于每一种最小生成树中,还是至 ...
- [CF160D]Edges in MST
[CF160D]Edges in MST 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le10^5)\)条边的连通图.对于图中的每条边,判断它与该图最小生成树的关系: 在该图所有的 ...
- [CF160D]Edges in MST (最小生成树+LCA+差分)
待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...
- Codeforces Round #599 (Div. 1) B. 0-1 MST 图论
D. 0-1 MST Ujan has a lot of useless stuff in his drawers, a considerable part of which are his math ...
- CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3
http://codeforces.com/problemset/problem/160/D 这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中 明显桥边 ...
- 清北学堂(2019 5 2) part 5
今天讲图论,顺便搞一搞之前没弄完的前向星dij 1.图的基本概念(课件原话): G (图)= (V(点); E(边)) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成 ...
- Codeforces Round #111 (Div. 2)
Codeforces Round #111 (Div. 2) C. Find Pair 题意 给\(N(N \le 10^5)\)个数,在所有\(N^2\)对数中求第\(K(K \le N^2)\)对 ...
- 算法8-4:Kruskal算法
Kruskal算法用于计算一个图的最小生成树.这个算法的过程例如以下: 依照边的权重从小到达进行排序 依次将每条边添加到最小生成树中,除非这条边会造成回路 实现思路 第一个步骤须要对边进行排序,排序方 ...
随机推荐
- linux 进程学习笔记-进程信号sigal
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...
- manacher(无讲解)
BZOJ3325: [Scoi2013]密码 https://lydsy.com/JudgeOnline/problem.php?id=3325 分析: 根据前i个字符和一些不等和相等条件就可以确定每 ...
- ESFramework Demo -- P2P通信Demo(附源码)
现在我们将在ESFramework Demo -- 文件传送Demo 的基础上,使用ESPlus提供的第四个武器,为其增加P2P通信的功能.在阅读本文之前,请务必先掌握ESFramework 开发手册 ...
- springboot集成报错,想要集成tk.mybatis报错,反射方法异常
在添加注释 @MapperScan("com.leyou.item.mapper")的时候,如果不小心就会导包倒错应该导成 import tk.mybatis.spring.ann ...
- httpmodule VS2012 和 VS2013
http://stackoverflow.com/questions/963545/httpmodule-not-running-with-visual-studio 如果将 httpmodule 配 ...
- VS2015中使用Git遇到问题 Cannot do push / pull in git - working with visual studio
I have made a lot of changes, when I am trying to push them - I am getting the next error: You canno ...
- framework资源文件读取
1.在framework里面读framwork自己的资源文件 这是framework内部的资源,跟其他都没有关系.但是framework不能单独存在,必须要放在某个“主程序”中才能起作用.bundle ...
- Sharepoint2013搜索学习笔记之设置sharepoint网站内容源(五)
第一步,进入管理中心,点击管理应用程序,点击search service 应用程序进入到搜索管理配置页面,点击内容源 第二步,点击新建内容源,给内容源命名,在爬网内容类型中选sharepoint网站, ...
- EasyUI获取所有选中行中的某一列的值
var PointIds=[]; for (var i = 0; i < wPoint_rows.length; i++) { //PointIds.push(wPoint_rows[i][&q ...
- MYSQL数据库设计规范11111
MYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确(长度不能超 ...