zoukankan      html  css  js  c++  java
  • Helvetic Coding Contest 2016 online mirror F1

    Description

    Heidi has finally found the mythical Tree of Life – a legendary combinatorial structure which is said to contain a prophecy crucially needed to defeat the undead armies.

    On the surface, the Tree of Life is just a regular undirected tree well-known from computer science. This means that it is a collection of npoints (called vertices), some of which are connected using n - 1 line segments (edges) so that each pair of vertices is connected by a path (a sequence of one or more edges).

    To decipher the prophecy, Heidi needs to perform a number of steps. The first is counting the number of lifelines in the tree – these are paths of length 2, i.e., consisting of two edges. Help her!

    Input

    The first line of the input contains a single integer n – the number of vertices in the tree (1 ≤ n ≤ 10000). The vertices are labeled with the numbers from 1 to n. Then n - 1 lines follow, each describing one edge using two space-separated numbers ab – the labels of the vertices connected by the edge (1 ≤ a < b ≤ n). It is guaranteed that the input represents a tree.

    Output

    Print one integer – the number of lifelines in the tree.

    Examples
    input
    4
    1 2
    1 3
    1 4
    output
    3
    input
    5
    1 2
    2 3
    3 4
    3 5
    output
    4
    Note

    In the second sample, there are four lifelines: paths between vertices 1 and 3, 2 and 4, 2 and 5, and 4 and 5.

    我们可以dfs遍历,但只遍历两个点就return,每个点遍历一次,就是/2就好啦

    #include<bits/stdc++.h>
    using namespace std;
    vector<int>q[100000];
    int flag[100000];
    int ans;
    void dfs(int v,int sum)
    {
        if(sum==2)
        {
            ans++;
            return;
        }
        if(flag[v])
        {
            return;
        }
        flag[v]=1;
        for(int i=0;i<q[v].size();i++)
        {
            if(!flag[q[v][i]])
            {
                dfs(q[v][i],sum+1);
            }
        }
    }
    int main()
    {
        int n;
        int v,u;
        ans=0;
        cin>>n;
        for(int i=1;i<=n-1;i++)
        {
            cin>>v>>u;
            q[v].push_back(u);
            q[u].push_back(v);
        }
        for(int i=1;i<=n;i++)
        {
            memset(flag,0,sizeof(flag));
            dfs(i,0);
        }
        cout<<ans/2<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    深入浅出TCP之listen
    indexing and hashing
    c++四种强制类型转化
    c++实现web服务框架
    MVC、MVP、MVVM概念解析
    常用设计模式
    [React]虚拟DOM
    防抖和节流
    函数柯里化
    apply, bind, call方法剖析
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/5661100.html
Copyright © 2011-2022 走看看