#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define ST first
#define ND second
#define PB push_back
#define SIZE(a) ((int)a.size())
template<class T, class U>
ostream& operator<<(ostream &stream, pair<T, U> &p) {
stream << "(" << p.ST << "," << p.ND << ")";
return stream;
}
template<class T>
ostream& operator<<(ostream &stream, vector<T> &v) {
stream << "[";
for(auto elem : v) {
stream << elem << ", ";
}
stream << "]";
return stream;
}
ll res;
vector<vector<pii>> v;
vector<bool> vis;
vector<int> low, pre;
int n, m;
pii dfs(int a, int peid, int eid, int &num) {
pii r = {1, 0};
vis[a] = true;
pre[a] = num++;
low[a] = pre[a];
for(auto x : v[a]) {
if(x.ND == peid) {
continue;
}
int b = x.ST;
if(vis[b]) {
low[a] = min(low[a], pre[b]);
} else {
pii q = dfs(b, x.ND, eid, num);
r.ST+=q.ST;
r.ND+=q.ND;
low[a] = min(low[a], low[b]);
}
}
if(peid > eid && low[a] == pre[a]) {
// cout << a << " " << peid << "\n";
r.ND++;
}
return r;
}
void create_graph(vector<pii> &e, int a, int b) {
for(int i=1; i <= n; i++) {
v[i].clear();
}
for(int i=0; i < SIZE(e); i++) {
if(i == a || i == b) {
continue;
}
pii x = e[i];
v[x.ST].PB({x.ND, i});
v[x.ND].PB({x.ST, i});
}
for(int i=1; i <= n; i++) {
vis[i] = false;
}
int num = 0;
auto r = dfs(1, -1, b, num);
if(r.ST < n) {
res+=(m-b-1);
} else {
res+=r.ND;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin >> n >> m;
v.resize(n+1);
vis.resize(n+1);
low.resize(n+1);
pre.resize(n+1);
vector<pii> e(m);
for(int i=0; i < m; i++) {
cin >> e[i].ST >> e[i].ND;
}
for(int i=0; i < m; i++) {
for(int j=i+1; j < m; j++) {
create_graph(e, i, j);
}
}
cout << res << "\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define ST first #define ND second #define PB push_back #define SIZE(a) ((int)a.size()) template<class T, class U> ostream& operator<<(ostream &stream, pair<T, U> &p) { stream << "(" << p.ST << "," << p.ND << ")"; return stream; } template<class T> ostream& operator<<(ostream &stream, vector<T> &v) { stream << "["; for(auto elem : v) { stream << elem << ", "; } stream << "]"; return stream; } ll res; vector<vector<pii>> v; vector<bool> vis; vector<int> low, pre; int n, m; pii dfs(int a, int peid, int eid, int &num) { pii r = {1, 0}; vis[a] = true; pre[a] = num++; low[a] = pre[a]; for(auto x : v[a]) { if(x.ND == peid) { continue; } int b = x.ST; if(vis[b]) { low[a] = min(low[a], pre[b]); } else { pii q = dfs(b, x.ND, eid, num); r.ST+=q.ST; r.ND+=q.ND; low[a] = min(low[a], low[b]); } } if(peid > eid && low[a] == pre[a]) { // cout << a << " " << peid << "\n"; r.ND++; } return r; } void create_graph(vector<pii> &e, int a, int b) { for(int i=1; i <= n; i++) { v[i].clear(); } for(int i=0; i < SIZE(e); i++) { if(i == a || i == b) { continue; } pii x = e[i]; v[x.ST].PB({x.ND, i}); v[x.ND].PB({x.ST, i}); } for(int i=1; i <= n; i++) { vis[i] = false; } int num = 0; auto r = dfs(1, -1, b, num); if(r.ST < n) { res+=(m-b-1); } else { res+=r.ND; } } int main() { ios_base::sync_with_stdio(0); cin >> n >> m; v.resize(n+1); vis.resize(n+1); low.resize(n+1); pre.resize(n+1); vector<pii> e(m); for(int i=0; i < m; i++) { cin >> e[i].ST >> e[i].ND; } for(int i=0; i < m; i++) { for(int j=i+1; j < m; j++) { create_graph(e, i, j); } } cout << res << "\n"; } |
English