#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; } |
English