#include <bits/stdc++.h> using namespace std; const int MAXM=5e5+10; int n, m; vector <pair <int, int> > g[MAXM], drz[MAXM], wst[MAXM]; int zak, zak2; int odw[MAXM], nr, low[MAXM], gle[MAXM]; long long wyn, licz; void dfs(int w, int gl) { odw[w]=nr; ++licz; gle[w]=gl; bool bojc=false; for(auto xd : g[w]) { if(xd.second==zak||xd.second==zak2) { continue; } if(odw[xd.first]!=nr) { drz[w].push_back(xd); dfs(xd.first, gl+1); } else { if(gle[xd.first]+1<gle[w]) { wst[w].push_back(xd); } else if(gle[xd.first]+1==gle[w]) { if(bojc) { wst[w].push_back(xd); } else { bojc=true; } } } } } void dfs2(int w) { odw[w]=nr; low[w]=gle[w]; for(auto xd : drz[w]) { dfs2(xd.first); low[w]=min(low[w], low[xd.first]); } for(auto xd : wst[w]) { low[w]=min(low[w], gle[xd.first]); } for(auto xd : drz[w]) { if(low[xd.first]==gle[xd.first]&&xd.second<zak) { ++wyn; } } } int main() { scanf("%d%d", &n, &m); for(int i=0; i<m; ++i) { int a, b; scanf("%d%d", &a, &b); g[a].push_back({b, i}); g[b].push_back({a, i}); } for(int i=0; i<m; ++i) { for(int j=i+1; j<m; ++j) { for(int k=1; k<=n; ++k) { drz[k].clear(); wst[k].clear(); } zak=i; zak2=j; licz=0; ++nr; dfs(1, 0); if(licz!=n) { wyn+=i; continue; } ++nr; dfs2(1); } } printf("%lld\n", wyn); 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 | #include <bits/stdc++.h> using namespace std; const int MAXM=5e5+10; int n, m; vector <pair <int, int> > g[MAXM], drz[MAXM], wst[MAXM]; int zak, zak2; int odw[MAXM], nr, low[MAXM], gle[MAXM]; long long wyn, licz; void dfs(int w, int gl) { odw[w]=nr; ++licz; gle[w]=gl; bool bojc=false; for(auto xd : g[w]) { if(xd.second==zak||xd.second==zak2) { continue; } if(odw[xd.first]!=nr) { drz[w].push_back(xd); dfs(xd.first, gl+1); } else { if(gle[xd.first]+1<gle[w]) { wst[w].push_back(xd); } else if(gle[xd.first]+1==gle[w]) { if(bojc) { wst[w].push_back(xd); } else { bojc=true; } } } } } void dfs2(int w) { odw[w]=nr; low[w]=gle[w]; for(auto xd : drz[w]) { dfs2(xd.first); low[w]=min(low[w], low[xd.first]); } for(auto xd : wst[w]) { low[w]=min(low[w], gle[xd.first]); } for(auto xd : drz[w]) { if(low[xd.first]==gle[xd.first]&&xd.second<zak) { ++wyn; } } } int main() { scanf("%d%d", &n, &m); for(int i=0; i<m; ++i) { int a, b; scanf("%d%d", &a, &b); g[a].push_back({b, i}); g[b].push_back({a, i}); } for(int i=0; i<m; ++i) { for(int j=i+1; j<m; ++j) { for(int k=1; k<=n; ++k) { drz[k].clear(); wst[k].clear(); } zak=i; zak2=j; licz=0; ++nr; dfs(1, 0); if(licz!=n) { wyn+=i; continue; } ++nr; dfs2(1); } } printf("%lld\n", wyn); return 0; } |