• bzoj2657: [Zjoi2012]旅游(journey)


    求树的直径 真是太神辣

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<algorithm>
     5 #include<iostream>
     6 
     7 using namespace std;
     8 
     9 template<typename Q> Q &read(Q &x) {
    10     static char c, f;
    11     for(f = 0; c = getchar(), !isdigit(c); ) if(c == '-') f = 1;
    12     for(x = 0; isdigit(c); c = getchar()) x = x * 10 + c - '0';
    13     if(f) x = -x; return x;
    14 }
    15 template<typename Q> Q read() {
    16     static Q x; read(x); return x;
    17 }
    18 
    19 const int N(200000);
    20 int n;
    21 
    22 bool neighbor(int a, int b) {
    23     return abs(a - b) == 1 || abs(a - b) == n - 1;
    24 }
    25 
    26 #include<map>
    27 map<pair<int, int>, int> mp;
    28 int ID(int u, int v) {
    29     if(u > v) swap(u, v);
    30     if(mp.count(make_pair(u, v))) return mp[make_pair(u, v)];
    31     return mp[make_pair(u, v)] = mp.size();
    32 }
    33 
    34 int no[N];
    35 
    36 #include<vector>
    37 vector<int> G[N];
    38 
    39 void AddEdge(int u, int v) {
    40     G[u].push_back(v);
    41     G[v].push_back(u);
    42 }
    43 
    44 int q[N], ql, qr, dep[N];
    45 
    46 void BFS(int s) {
    47     ql = qr = 0;
    48     memset(dep, 0, sizeof dep);
    49     q[qr++] = s, dep[s] = 1;
    50     while(ql < qr) {
    51         int u = q[ql++];
    52         for(unsigned i = 0; i < G[u].size(); i++) {
    53             int v = G[u][i];
    54             if(!dep[v]) {
    55                 q[qr++] = v;
    56                 dep[v] = dep[u] + 1;
    57             }
    58         }
    59     }
    60 }
    61 
    62 int main() {
    63 #ifdef DEBUG
    64     freopen("in.txt", "r", stdin);
    65     freopen("out.txt", "w", stdout);
    66 #endif
    67     
    68     scanf("%d", &n);
    69     for(int i = 1; i <= n - 2; i++) {
    70         int a[4];
    71         for(int j = 0; j < 3; j++) scanf("%d", a + j);
    72         a[3] = a[0];
    73         for(int j = 0; j < 3; j++) {
    74             if(!neighbor(a[j], a[j+1])) {
    75                 int id = ID(a[j], a[j+1]);
    76                 if(no[id]) AddEdge(no[id], i);
    77                 else no[id] = i;
    78             }
    79         }
    80     }
    81     
    82     BFS(1), BFS(q[qr - 1]);
    83     printf("%d
    ", dep[q[qr - 1]]);
    84     
    85     return 0;
    86 }
    View Code
  • 相关阅读:
    树与树的表示
    队列的顺序/链式存储实现
    堆栈的链式存储实现
    堆栈的顺序存储实现
    线性表的链式存储求表长,查找,插入,删除
    C语言博客作业--函数
    C语言博客作业--嵌套循环
    C语言第三次博客作业---单层循环结构
    C语言第二次博客作业---分支结构
    C语言第一次博客作业——输入输出格式
  • 原文地址:https://www.cnblogs.com/showson/p/5221575.html
Copyright © 2020-2023  润新知