SAFENET2 - Mạng máy tính an toàn
Tác giả: ladpro98
Ngôn ngữ: C++
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <climits>
#include <cstdlib>
#include <ctime>
#include <memory.h>
#include <cassert>
#include <climits>
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, a, b) for(int i = (a); i <=(b); i++)
#define FORD(i, a, b) for(int i = (a); i > (b); i--)
#define REPD(i, a, b) for(int i = (a); i >=(b); i--)
#define TR(it, a) for(typeof((a).begin()) it = (a).begin(); it != (a).end(); it++)
#define RESET(a, v) memset((a), (v), sizeof((a)))
#define SZ(a) (int((a).size()))
#define ALL(a) (a).begin(), (a).end()
#define PB push_back
#define MP make_pair
#define LL long long
#define LD long double
#define II pair<int, int>
#define X first
#define Y second
#define VI vector<int>
const int N = 30003;
using namespace std;
VI a[N];
int low[N], num[N];
int n, m, timer, ans;
stack<II> s;
void dfs(int u, int par) {
num[u] = ++timer; low[u] = INT_MAX;
TR(v, a[u]) if (*v != par) {
if (num[*v]) low[u] = min(low[u], num[*v]);
else {
s.push(MP(u, *v));
dfs(*v, u);
low[u] = min(low[u], low[*v]);
if (low[*v] >= num[u]) {
int cnt = 1; II edge;
do {
edge = s.top(); s.pop();
++cnt;
} while (edge != MP(u, *v));
ans = max(ans, cnt);
}
}
}
}
int main() {
ios :: sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
int u, v;
FOR(i, 0, m) {
cin >> u >> v;
a[u].PB(v); a[v].PB(u);
}
ans = 1;
REP(i, 1, n) if (num[i] == 0)
dfs(i, 0);
cout << ans;
return 0;
}