hihocoder 1183 割点和割边

链接:

http://hihocoder.com/problemset/problem/1183

代码:

 1 #include <map>
 2 #include <set>
 3 #include <cmath>
 4 #include <queue>
 5 #include <stack>
 6 #include <cstdio>
 7 #include <string>
 8 #include <vector>
 9 #include <cstdlib>
10 #include <cstring>
11 #include <sstream>
12 #include <iostream>
13 #include <algorithm>
14 #include <functional>
15 using namespace std;
16 #define rep(i,a,n) for (int i=a;i<n;i++)
17 #define per(i,a,n) for (int i=n-1;i>=a;i--)
18 #define all(x) (x).begin(),(x).end()
19 #define pb push_back
20 #define mp make_pair
21 #define lson l,m,rt<<1
22 #define rson m+1,r,rt<<1|1
23 typedef long long ll;
24 typedef vector<int> VI;
25 typedef pair<int, int> PII;
26 const ll MOD = 1e9 + 7;
27 const int INF = 0x3f3f3f3f;
28 const int MAXN = 2e4 + 7;
29 // head
30
31 int n, m, order = 0;
32 int low[MAXN], dfn[MAXN];
33 int par[MAXN], son[MAXN];
34 VI G[MAXN];
35 VI cutpoint;
36 vector<PII> cutedge;
37
38 void tarjan(int u) {
39     dfn[u] = low[u] = ++order;
40     bool flag = false;
41     rep(i, 0, G[u].size()) {
42         int v = G[u][i];
43         if (!dfn[v]) {
44             son[u]++;
45             par[v] = u;
46             tarjan(v);
47             if (low[v] >= dfn[u]) flag = true;
48             if (low[v] > dfn[u]) cutedge.pb(mp(min(v, u), max(v, u)));
49             low[u] = min(low[u], low[v]);
50         }
51         else if (v != par[u]) low[u] = min(low[u], dfn[v]);
52     }
53     if ((par[u] == 0 && son[u] > 1) || (par[u] && flag)) cutpoint.pb(u);
54 }
55
56 int main()
57 {
58     cin >> n >> m;
59     while (m--) {
60         int u, v;
61         scanf("%d%d", &u, &v);
62         G[u].pb(v);
63         G[v].pb(u);
64     }
65     tarjan(1);
66     sort(cutedge.begin(), cutedge.end());
67     sort(cutpoint.begin(), cutpoint.end());
68     if (cutpoint.size() == 0) cout << "Null" << endl;
69     else {
70         cout << cutpoint[0];
71         rep(i, 1, cutpoint.size()) printf(" %d", cutpoint[i]);
72         cout << endl;
73     }
74     rep(i, 0, cutedge.size())
75         printf("%d %d\n", cutedge[i].first, cutedge[i].second);
76     return 0;
77 }
时间: 2024-11-07 09:10:18

hihocoder 1183 割点和割边的相关文章

hihoCoder 1183 连通性一&#183;割边与割点(Tarjan求割点与割边)

#1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失.为了避免再次出现这样的情况,学校决定对校园网络进行重新设计. 学校现在一共拥有N台服务器(编号1..N)以及M条连接,保证了任意两台服务器之间都能够通过连接直接或者间接的数据通讯. 当发生黑客攻击时,学校会立刻切断网络中的一条连接或是立刻关闭一台服务器,使得整个网络被隔离成两个独立的部分. 举个

HihoCoder 1183 : 连通性一&#183;割边与割点

连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失.为了避免再次出现这样的情况,学校决定对校园网络进行重新设计. 学校现在一共拥有N台服务器(编号1..N)以及M条连接,保证了任意两台服务器之间都能够通过连接直接或者间接的数据通讯. 当发生黑客攻击时,学校会立刻切断网络中的一条连接或是立刻关闭一台服务器,使得整个网络被隔离成两个独立的部分. 举个例子,对于以下的

《啊哈算法》——割点、割边、二分图

这篇文章我们简单的介绍求解图的割点.割边和二分图相关的概念. 割点: 对于含n个点.m条边的连通无向图G,如果去掉顶点vi(并同时去掉与之相连的边),使得G不再连通,那么称vi是一个割点. 通过其定义,我们不难判断某个点是否是割点,但是现在我们面临的问题是,如何给出一个图G,编码让计算机求解割点呢? 首先我们考虑这样一个问题,判定某个点的指标是什么.我们通过人脑来判断其是否是割点,其实是利用非常模糊的视觉效应,即“通过去掉该点观察图是否连通”即可,而如果想要通过计算机来判断,就需要非常量化的判断

『Tarjan算法 无向图的割点与割边』

无向图的割点与割边 定义:给定无相连通图\(G=(V,E)\) 若对于\(x \in V\),从图中删去节点\(x\)以及所有与\(x\)关联的边后,\(G\)分裂为两个或以上不连通的子图,则称\(x\)为\(G\)的割点. 若对于\(e \in E\),从图中删去边\(e\)之后,\(G\)分裂为两个不连通的子图,则称\(e\)为\(G\)的割边. 对于很多图上问题来说,这两个概念是很重要的.我们将探究如何求解无向图的割点与割边. 预备知识 时间戳 图在深度优先遍历的过程中,按照每一个节点第一

图论分支-Tarjan初步-割点和割边

所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就应该能简单理解(怎么可能)割点割边了. 所以我们再来看一个图 这样大家就能明白了吧(明白是明白了,但是要他干嘛(自动忽略))到后面会明白的. 然后怎么求,这是一个问题,直接想法是搜索,枚举每一个点,然后再去检验是否联通,这样的复杂度应该是O(n2),很显然很不优秀,万一数据是1e5以上不就凉凉了吗.

图的割点与割边(超详细!!!)

·割点 割点概念,应该很好理解: 在一个无向图中,如果删除某个顶点,这个图就不再连通(任意两点之间无法相互到达),那么这个顶点就是这个图的割点. 举个例子: 图中的2号顶点就是割点, 删除2号后,4,5不通,1,6也不通等等 如何求割点? 很容易想到的方法是:依次删除每一个顶点,然后用dfs或者bfs来检查图是否依然连通.如果删除某个顶点后,导致图不再连通,那么刚才删除的顶点就是割点. 这种方法的时间复杂度是O(N(N+M)). 下面寻找复杂度低的方法来解决. 首先从图中任意节点开始dfs遍历上

求桥,割点(HihoCoder - 1183 )

#include<cstdio>#include<cstring>#include<algorithm>using namespace std; struct my{   int v;   int next;};struct dage{  int u;  int v;}; dage gebian[1000000*2+10];int topbian;bool  iscut[200000+10];int adj[200000+10];my bian[2000000+10];

poj Transferring Sylla(如何快速的判断一个图是否是3—连通图,求割点,割边)

Transferring Sylla 首先,什么是k连通图?k连通图就是指至少去掉k个点使之不连通的图. 题目: 题目描述的很裸,就是给你一张图要求你判断这图是否是3-连通图. 算法分析: ///////////////////////////////////////////////////////////////////// (网上别人的分析,分析的很好所以直接引用了) 考虑一下不可行的情况,就是存在两点间的路径条数<3情况,那么我们可以去枚举两个点a和b,然后将其和相邻的边删除,然后判断联通

图的割点与割边

割点 什么是割点? 如果在一个图中,如果把一个点删除,那么这个图不再联通,那么这个点就是割点(割顶),当然是在无向图. 如何实现? 如果我们尝试删除每个点,并且判断这个图的联通性,那么复杂度会特别的高.所以要介绍一个常用的算法:\(Tarjan\). 首先,我们上一个图: 很容易的看出割点是 2,而且这个图仅有这一个割点. 首先,我们按照 \(DFS\) 序给他打上时间戳(访问的顺序). 这些信息被我们保存在一个叫做 num 的数组中. 还需要另外一个数组 low,用它来存储不经过其父亲(你有多