Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long int
- int in=-1;
- int n, m;
- vector<vector<int> > edges;
- vector<int> dp, tin, parent;
- vector<int> cnt;
- int tt = 0, ans = 0, total;
- vector<bool> vis;
- vector<bool> cond;
- int diam = 0;
- void df(int u,int par=-1)
- {
- vis[u]=true;
- for(ll v : edges[u])
- {
- if(!vis[v])
- df(v,u);
- else if(v!=par && vis[v])
- in=v;
- }
- }
- void dfs(int u, int par = -1){
- tin[u] = tt++;
- vis[u] = true;
- for(auto v : edges[u]){
- if(v == par) continue;
- if(!vis[v]){
- dfs(v, u);
- dp[u] += dp[v];
- }
- else if(tin[v]<tin[u]) dp[u]++, cond[u] = false;
- else if(tin[v] > tin[u]) dp[u]--, cond[u] = false;
- cond[u]= cond[u] & cond[v];
- }
- if(dp[u] != 0 or par == -1) cond[u] = false;
- if(!cond[u]) return;
- for(auto v : edges[u]){
- if(v == par) continue;
- parent[v] = u;
- }
- parent[u] = u;
- }
- int coun;
- void process(int u, int par = -1){
- vis[u] = true;
- int high = 0, s_high = 0;
- for(auto v : edges[u]){
- if(parent[v] == -1) continue;
- if(!vis[v]){
- process(v);
- int tmp = cnt[v] + (dp[v] == 0);
- // cout << u << ":" << v << " " << tmp << "\n";
- total += (dp[v] == 0);
- if(high <= tmp) s_high = high, high = tmp;
- else if(tmp >= s_high) s_high = tmp;
- cnt[u] = max(cnt[u], tmp);
- }
- }
- coun++;
- diam = max(diam, high + s_high);
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- // freopen("output.txt","w", stdout);
- #endif
- edges.clear();
- cin >> n >> m;
- edges.resize(n+1);
- dp.clear();
- dp.resize(n+1, 0);
- tin.clear();
- tin.resize(n+1);
- vis.clear();
- vis.resize(n+10, false);
- cnt.clear();
- cnt.resize(n+1, 0);
- int u, v;
- for(int i = 0; i < m; i++) {
- cin >> u >> v;
- edges[u].push_back(v);
- edges[v].push_back(u);
- }
- df(1);
- vis.clear();
- vis.resize(n+1, false);
- if(in==-1)
- cout<<n;
- else
- {
- cond.resize(n+1, true);
- parent.resize(n+1, -1);
- dfs(in,-1);
- diam = 0;
- int cur = 0, tmp = 0;
- vis.clear();
- vis.resize(n+1, false);
- for(int i = 1; i <= n; i++){
- if(parent[i] == i and dp[i] == 0){
- diam = 0;
- coun = 0;
- process(i);
- if(diam >= cur) cur = diam, tmp = coun;
- }
- }
- cout << tmp << "\n";
- }
- }
Add Comment
Please, Sign In to add comment