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 图论的更多相关文章

  1. Codeforces 160D Edges in MST tarjan找桥

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

  2. Codeforces 160 D. Edges in MST

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

  3. [CF160D]Edges in MST

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

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

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

  5. 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 ...

  6. CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3

    http://codeforces.com/problemset/problem/160/D 这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中 明显桥边 ...

  7. 清北学堂(2019 5 2) part 5

    今天讲图论,顺便搞一搞之前没弄完的前向星dij 1.图的基本概念(课件原话): G (图)= (V(点); E(边)) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成 ...

  8. 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)\)对 ...

  9. 算法8-4:Kruskal算法

    Kruskal算法用于计算一个图的最小生成树.这个算法的过程例如以下: 依照边的权重从小到达进行排序 依次将每条边添加到最小生成树中,除非这条边会造成回路 实现思路 第一个步骤须要对边进行排序,排序方 ...

随机推荐

  1. listen 54

    Our library is also open for the local residents. People are doing their Christmas shopping. Later t ...

  2. PyNLPIR python中文分词工具

    官网:https://pynlpir.readthedocs.io/en/latest/  github:https://github.com/tsroten/pynlpir          NLP ...

  3. 网络编程学习笔记-MAC地址和IP地址的关系

    简单地说:ip地址是服务商给你的,mac地址是你的网卡物理地址. 一.IP地址 对于IP地址,相信大家都很熟悉,即指使用TCP/IP协议指定给主机的32位地址.IP地址由用点分隔开的4个8八位组构成, ...

  4. linux网络编程 inet_aton(); inet_aton; inet_addr;

    . inet_aton()是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址. . inet_ntoa() 本函数将一个用in参数所表示的Internet地址结构转换成以“.” ...

  5. SoundHound Inc. Programming Contest 2018

    A - F Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are give ...

  6. 「USACO08DEC」「LuoguP2921」在农场万圣节Trick or Treat on the Farm(tarjan

    题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...

  7. 洛谷P2983 [USACO10FEB]购买巧克力Chocolate Buying

    题目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Chocolate Sto ...

  8. 【LeetCode】016 3Sum Closest

    题目: Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  9. 【Lintcode】069.Binary Tree Level Order Traversal

    题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to ri ...

  10. ubuntu14.04 设置默认使用root用户登录

    首先修改/etc/lightdm/lightdm.conf,设置autologin-user=root 但是此时直接重启,会报如下的错误: 解决办法: 使用命令: vim /root/.profile ...