#include <iostream>
#include <vector>
#include <map>
#include <set>
int n, m;
std::vector<std::vector<std::pair<int, int>>> E;
std::vector<bool> vis;
//std::vector<bool> ignore;
//
//std::set<int> s1;
//std::set<std::pair<int, int>> s2;
//std::set<std::tuple<int, int, int>> s3;
//
//inline void update(std::pair<int, std::pair<int, int>>& p, int v) {
// if (p.first == 0) p.second.first = v;
// if (p.first == 1) p.second.second = v;
// p.first++;
//}
//
//inline void update(std::pair<int, std::pair<int, int>>& p, std::pair<int, std::pair<int, int>> const& v) {
// if (p.first == 0) {
// p.second.first = v.second.first;
// p.second.second = v.second.second;
// }
// if (p.first == 1) p.second.second = v.second.first;
// p.first += v.first;
//}
//
//std::map<int, std::pair<int, std::pair<int, int>>> dfs(int i, int ep=-1) {
// vis[i] = 1;
// std::cerr<<ep<<" ";
//
// std::map<int, std::pair<int, std::pair<int, int>>> ret;
// for (auto [x, ei] : E[i]) {
// if (ignore[x]) continue;
// if (ei != ep) {
// if (vis[x]) {
// if (x != i) update(ret[x], ei);
// } else {
// auto m = dfs(x, ei);
// for (auto [k, v] : m) {
// if (k != i) update(ret[k], v);
// }
// }
// }
// }
//
// ignore[i] = 1;
//
// if (ep == -1) return ret;
//
// if (ret.size() == 0) s1.insert(ep);
// if (ret.size() == 1) {
// if (ret.begin()->second.first == 1) s2.insert({ep, ret.begin()->second.second.first});
// if (ret.begin()->second.first == 2) s3.insert({ep, ret.begin()->second.second.first, ret.begin()->second.second.second});
// }
// if (ret.size() == 2) {
// if (ret.begin()->second.first == 1 && ret.rbegin()->second.first == 1) {
// s3.insert({ep, ret.begin()->second.second.first, ret.rbegin()->second.second.first});
// }
// }
//
// return ret;
//}
template<typename T>
inline bool cont(std::set<T> const& a, T const& b) {
return a.find(b) != a.end();
}
int check(int i, int a, int b, int c) {
if (vis[i]) return 0;
int ret = 1;
vis[i] = 1;
for (auto [x, ei] : E[i]) {
if (ei != a && ei != b && ei != c) ret += check(x, a, b, c);
}
return ret;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin >> n >> m;
E.resize(n);
for (int i = 0; i < m; ++i) {
int a, b;
std::cin >> a >> b;
--a; --b;
E[a].push_back({b, i});
E[b].push_back({a, i});
}
//vis.resize(n);
//ignore.resize(n);
//dfs(0);
//for (int i = 0; i < n; ++i) {
// if (E[i].size() == 2) s2.insert({E[i][0].second, E[i][1].second});
// if (E[i].size() == 3) s3.insert({E[i][0].second, E[i][1].second, E[i][2].second});
//}
//std::cerr << "s1: "; for (auto x : s1) std::cerr << "(" << x << ") "; std::cerr << std::endl;
//std::cerr << "s2: "; for (auto x : s2) std::cerr << "(" << x.first << "," <<x.second << ") "; std::cerr << std::endl;
//std::cerr << "s3: "; for (auto x : s3) std::cerr << "(" << std::get<0>(x) << "," << std::get<1>(x) << "," << std::get<2>(x) << ") "; std::cerr << std::endl;
long long ret = 0;
for (int a = 0; a < m; ++a) {
for (int b = a + 1; b < m; ++b) {
for (int c = b + 1; c < m; ++c) {
//bool x = true;
//if (cont(s1, a) || cont(s1, b) || cont(s1, c) ||
// cont(s2, {a, b}) || cont(s2, {a, c}) || cont(s2, {b, a}) || cont(s2, {b, c}) || cont(s2, {c, a}) || cont(s2, {c, b}) ||
// cont(s3, {a, b, c}) || cont(s3, {a, c, b}) || cont(s3, {b, a, c}) || cont(s3, {b, c, a}) || cont(s3, {c, a, b}) || cont(s3, {c, b, a})) {
// ret++;
// x = false;
//}
vis = std::vector<bool>(m);
int z = check(0, a, b, c);
ret += z != n;
//if (x != (z == n)) {
// std::cerr << "err " << z <<","<<x<< " -> " << a << " " << b << " " << c << std::endl;
//}
}
}
}
std::cout << ret;
return 0;
}
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #include <iostream> #include <vector> #include <map> #include <set> int n, m; std::vector<std::vector<std::pair<int, int>>> E; std::vector<bool> vis; //std::vector<bool> ignore; // //std::set<int> s1; //std::set<std::pair<int, int>> s2; //std::set<std::tuple<int, int, int>> s3; // //inline void update(std::pair<int, std::pair<int, int>>& p, int v) { // if (p.first == 0) p.second.first = v; // if (p.first == 1) p.second.second = v; // p.first++; //} // //inline void update(std::pair<int, std::pair<int, int>>& p, std::pair<int, std::pair<int, int>> const& v) { // if (p.first == 0) { // p.second.first = v.second.first; // p.second.second = v.second.second; // } // if (p.first == 1) p.second.second = v.second.first; // p.first += v.first; //} // //std::map<int, std::pair<int, std::pair<int, int>>> dfs(int i, int ep=-1) { // vis[i] = 1; // std::cerr<<ep<<" "; // // std::map<int, std::pair<int, std::pair<int, int>>> ret; // for (auto [x, ei] : E[i]) { // if (ignore[x]) continue; // if (ei != ep) { // if (vis[x]) { // if (x != i) update(ret[x], ei); // } else { // auto m = dfs(x, ei); // for (auto [k, v] : m) { // if (k != i) update(ret[k], v); // } // } // } // } // // ignore[i] = 1; // // if (ep == -1) return ret; // // if (ret.size() == 0) s1.insert(ep); // if (ret.size() == 1) { // if (ret.begin()->second.first == 1) s2.insert({ep, ret.begin()->second.second.first}); // if (ret.begin()->second.first == 2) s3.insert({ep, ret.begin()->second.second.first, ret.begin()->second.second.second}); // } // if (ret.size() == 2) { // if (ret.begin()->second.first == 1 && ret.rbegin()->second.first == 1) { // s3.insert({ep, ret.begin()->second.second.first, ret.rbegin()->second.second.first}); // } // } // // return ret; //} template<typename T> inline bool cont(std::set<T> const& a, T const& b) { return a.find(b) != a.end(); } int check(int i, int a, int b, int c) { if (vis[i]) return 0; int ret = 1; vis[i] = 1; for (auto [x, ei] : E[i]) { if (ei != a && ei != b && ei != c) ret += check(x, a, b, c); } return ret; } int main() { std::ios::sync_with_stdio(false); std::cin >> n >> m; E.resize(n); for (int i = 0; i < m; ++i) { int a, b; std::cin >> a >> b; --a; --b; E[a].push_back({b, i}); E[b].push_back({a, i}); } //vis.resize(n); //ignore.resize(n); //dfs(0); //for (int i = 0; i < n; ++i) { // if (E[i].size() == 2) s2.insert({E[i][0].second, E[i][1].second}); // if (E[i].size() == 3) s3.insert({E[i][0].second, E[i][1].second, E[i][2].second}); //} //std::cerr << "s1: "; for (auto x : s1) std::cerr << "(" << x << ") "; std::cerr << std::endl; //std::cerr << "s2: "; for (auto x : s2) std::cerr << "(" << x.first << "," <<x.second << ") "; std::cerr << std::endl; //std::cerr << "s3: "; for (auto x : s3) std::cerr << "(" << std::get<0>(x) << "," << std::get<1>(x) << "," << std::get<2>(x) << ") "; std::cerr << std::endl; long long ret = 0; for (int a = 0; a < m; ++a) { for (int b = a + 1; b < m; ++b) { for (int c = b + 1; c < m; ++c) { //bool x = true; //if (cont(s1, a) || cont(s1, b) || cont(s1, c) || // cont(s2, {a, b}) || cont(s2, {a, c}) || cont(s2, {b, a}) || cont(s2, {b, c}) || cont(s2, {c, a}) || cont(s2, {c, b}) || // cont(s3, {a, b, c}) || cont(s3, {a, c, b}) || cont(s3, {b, a, c}) || cont(s3, {b, c, a}) || cont(s3, {c, a, b}) || cont(s3, {c, b, a})) { // ret++; // x = false; //} vis = std::vector<bool>(m); int z = check(0, a, b, c); ret += z != n; //if (x != (z == n)) { // std::cerr << "err " << z <<","<<x<< " -> " << a << " " << b << " " << c << std::endl; //} } } } std::cout << ret; return 0; } |
English