#include <bits/stdc++.h>
#define ld long double
#define ll long long
#define F first
#define S second
#define pb push_back
#define mp make_pair
using namespace std;
const ll inf = 1e18 + 18;
const int maxn = 200005;
int used[maxn];
bool cycle[maxn];
pair <int, int> cc[maxn]; // {len, cnt}
vector <int> g[maxn];
int cyclesz = 0;
vector <int> path;
bool f = false;
void findcycle(int v, int pr)
{
used[v] = 1;
path.pb(v);
for(int to:g[v])
{
if (used[to] == 0)
{
findcycle(to, v);
if (f) return; //
}
if (used[to] == 1 && pr != to)
{
f = true;
cycle[to] = true;
cyclesz = 1;
while(path.back() != to)
{
cycle[path.back()] = true;
path.pop_back();
cyclesz++;
}
return;
}
}
path.pop_back();
used[v] = 2;
return;
}
int len = 0;
int ans = 0; //ll
pair <int, int> dfs(int v, int pr)
{
vector <pair <int, int>> vc;
vc.pb({0, 1});
for(int to:g[v])
{
if (to != pr && !cycle[to])
{
vc.pb(dfs(to, v));
vc.back().F++;
}
}
sort(vc.rbegin(), vc.rend());
int n = int(vc.size());
int i = 0;
if (n == 1)
{
return vc[0];
}
if (vc[0].F == vc[1].F && vc[0].F * 2 >= len)
{
int izm = 0;
int sum = 0;
while(i < n && vc[i].F == vc[0].F)
{
sum += vc[i].S;
// cerr << vc[i].S;
i++;
}
i = 0;
while(i < n && vc[i].F == vc[0].F)
{
izm += sum * (sum - vc[i].S);
i++;
}
if (vc[0].F * 2 > len)
{
len = vc[0].F * 2;
ans = izm;
}
else
{
ans += izm;
}
}
else
if (vc[0].F != vc[1].F && vc[0].F + vc[1].F >= len)
{
int izm = 0;
i = 1;
while(i < n && vc[i].F == vc[0].F)
{
izm += vc[i].S;
i++;
}
if (vc[0].F + vc[1].F > len)
{
ans = izm;
}
else
{
ans += izm;
}
len = vc[0].F + vc[1].F;
}
i = 0;
int ret = 0;
while(i < n && vc[i].F == vc[0].F)
{
ret += vc[i].S;
i++;
}
if (v == 7)
{
// cerr << ret << endl;
}
return {vc[0].F, ret};
}
main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#else
#endif
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
int x, y;
cin >> x >> y;
x--;
y--;
g[x].pb(y);
g[y].pb(x);
}
findcycle(0, 0);
for(int i = 0; i < n; i++)
{
if (cycle[i])
{
pair <int, int> pp = dfs(i, i);
cc[i] = pp;
}
}
for(int i = 0; i < n; i++)
{
if (cycle[i])
{
for(int j:g[i])
{
if (cycle[j])
{
//obhod
int v = j;
int pr = i;
int LEN = cc[i].F;
int CNT = cc[i].S;
int t = (cyclesz >> 1);
for(t; t > 0; t--)
{
LEN++;
int to = -1;
for(auto ttt:g[v])
{
if (cycle[ttt] && ttt != pr)
{
to = ttt;
break;
}
}
if (LEN + cc[to].F > len)
{
len = LEN + cc[to].F;
ans = CNT * cc[to].S;
}
else
if (LEN + cc[to].F == len)
{
ans += CNT * cc[to].S;
}
}
}
}
}
}
// cerr << len << endl;
cout << (ans >> 1);
return 0;
}
Compilation message
shymbulak.cpp:138:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
main()
^
shymbulak.cpp: In function 'int main()':
shymbulak.cpp:184:26: warning: statement has no effect [-Wunused-value]
for(t; t > 0; t--)
^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
5120 KB |
Output is correct |
2 |
Incorrect |
6 ms |
5120 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
5120 KB |
Output is correct |
2 |
Incorrect |
8 ms |
5120 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
90 ms |
8312 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |