답안 #45181

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
45181 2018-04-11T16:40:02 Z rajarshi_basu 관광지 (IZhO14_shymbulak) C++14
0 / 100
155 ms 11540 KB
#include <iostream>
#include <algorithm>
#include <stack>
#include <string>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <functional>


#define FOR(i,n) for(int i=0;i<n;i++)
#define FORE(i,a,b) for(int i=a;i<=b;i++)
#define ll long long int
#define pb(a) push_back(a)
#define vi vector<int>
#define ii pair<int,int>
#define iii pair<bool, pair<int,int> >
#define mp(a,b) make_pair(a,b)

struct Edge{
  int a;int b;
  int ind;
  bool bad;
};

using namespace std;

vector<Edge*>* g;
int n;
Edge** edges;
bool* sp_node;
bool* sp_edge;
bool* visited;
int ancestor = -1;
bool ex = false;
int IND__ = 0;
int* index_;

void dfs_cycle(int node,int p){
  visited[node] = true;
  FOR(i,g[node].size()){
    Edge* ed = g[node][i];
    int u = (ed->a == node)?ed->b:ed->a;
    if(u == p)continue;
    if(visited[u]){
      ancestor = u;
      if(ex)return;
      ed->bad = true;
      //ed->ind = IND__++;
      index_[node] = IND__++;
      return;
    }else{
      if(ex)return;
      dfs_cycle(u,node);
      if(ancestor != -1){
        if(ancestor == node){
          ed->bad = true;
          //ed->ind = IND__++;
          index_[node] = IND__++;
          ex = true;
        }
        if(ex)return;
        ed->bad = true;
        //ed->ind = IND__++;
        index_[node] = IND__++;
        return;
      }
    }
  }
}



ii maxDpthDFS(int node,int p){
  ii mx;
  mx.first = 0;mx.second = 1;
  FOR(i,g[node].size()){
    Edge* ed = g[node][i];
    int u = ed->a == node?ed->b:ed->a;
    if(u == p)continue;
    if(ed->bad)continue;
    ii val = maxDpthDFS(u,node);
    if(val.first > mx.first){
      mx.first = val.first;
      mx.second = val.second;
    }else if(val.first == mx.first){
      mx.second+=val.second;
    }
  }
  mx.first++;
  return mx;
}

int main(){
  cin >> n;
  g = new vector<Edge*>[n];
  index_= new int[n];
  FOR(i,n){
    index_[i] = -1;
  }
  edges = new Edge*[n];
  FOR(i,n){
    int a,b;
    cin >> a >> b;
    a--;
    b--;
    Edge* ed = new Edge();
    ed->a = a;
    ed->b = b;
    ed->bad = false;
    edges[i] = ed;
    g[a].pb(ed);
    g[b].pb(ed);
  }
  visited = new bool[n];
  FOR(i,n)visited[i] = false;
  dfs_cycle(0,-1);
  //cout <<ancestor<<endl;
  //cout << endl<<endl;
  //cout <<ancestor<<endl;
  //FOR(i,n){
  //  if(edges[i]->bad){
  //    cout << edges[i]->a +1<< "  " << edges[i]->b + 1<<endl;
  //  }
  //}
  sp_node = new bool[n];
  sp_edge = new bool[n];
  FOR(i,n)sp_node[i] = sp_edge[i] = false;
  FOR(i,n){
    if(edges[i]->bad){
      sp_node[edges[i]->a] = sp_node[edges[i]->b] = true;
      sp_edge[i] = true;
    }
  }
  //cout << "hell0" <<endl;
  ii vals[n];
  FOR(i,n)vals[i].first = vals[i].second = 0;
  FOR(i,n){
    if(sp_node[i])vals[i] = maxDpthDFS(i,-1);
  }
  //cout << IND__ <<endl;
  ii all[IND__*3];
  //IND__ = 0;
  FOR(i,n){
  // cout << i << " -->  " << sp_node[i] << "  ->>  " << index_[i] << endl;
  }
  FOR(i,n){
    //cout << edges[i]->a  << "  "<<edges[i]->b << "  " <<edges[i]->bad << " " <<edges[i]->ind<<endl;
  }
  FOR(i,n){
    if(sp_node[i]){
      all[index_[i]+IND__*2] = all[index_[i]+IND__] = all[index_[i]] = vals[i];
    }
  }
  
  FOR(i,n){
   // cout << vals[i].first << " " << vals[i].second <<endl;
  }
  //cout <<endl;
  FOR(i,3*IND__){
   // cout << all[i].first << " "<<all[i].second <<endl;
  }

  int mx=0;ll ctr=0;
  int cnt = IND__/2;
  //cout << "cnt : "<<cnt<<endl;
  FOR(i,IND__){
    //int st = IND__ + i;
    i+=IND__;
    FORE(j,1,cnt){

      if(all[i].first + all[i+j].first + j-1 > mx){
        mx= all[i].first + all[i+j].first + j-1;
        ctr = all[i].second*all[i+j].second;
      }else if(all[i].first + all[i+j].first + j-1 == mx){
        ctr += all[i].second*all[i+j].second;
      }
      //if(IND__%2==0 && j == cnt)continue;
      if(all[i].first + all[i-j].first + j-1 > mx){
        mx= all[i].first + all[i-j].first + j-1;
        ctr = all[i].second*all[i-j].second;
      }else if(all[i].first + all[i-j].first + j-1 == mx){
        ctr += all[i].second*all[i-j].second;
      }
    }
    //cout << mx << "    =----=    "<<ctr <<endl;
    i-=IND__;

  }
  //cout << mx <<endl;
  cout << ctr/2 <<endl;

  return 0;
}

Compilation message

shymbulak.cpp: In function 'void dfs_cycle(int, int)':
shymbulak.cpp:11:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,n) for(int i=0;i<n;i++)
shymbulak.cpp:41:7:
   FOR(i,g[node].size()){
       ~~~~~~~~~~~~~~~~         
shymbulak.cpp:41:3: note: in expansion of macro 'FOR'
   FOR(i,g[node].size()){
   ^~~
shymbulak.cpp: In function 'std::pair<int, int> maxDpthDFS(int, int)':
shymbulak.cpp:11:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,n) for(int i=0;i<n;i++)
shymbulak.cpp:77:7:
   FOR(i,g[node].size()){
       ~~~~~~~~~~~~~~~~         
shymbulak.cpp:77:3: note: in expansion of macro 'FOR'
   FOR(i,g[node].size()){
   ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 248 KB Output is correct
2 Incorrect 2 ms 356 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 560 KB Output is correct
2 Incorrect 2 ms 560 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 155 ms 11540 KB Output isn't correct
2 Halted 0 ms 0 KB -