Wannafly挑战赛1:A-Treepath(DFS或BFS)

来源:互联网 发布:java怎么用hadoop 编辑:程序博客网 时间:2024/05/17 03:08

Treepath

Time limit:1000ms Memory limit:32768K


Problem Description

给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。

Input

第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000

Output

一行一个整数表示答案。

Sample Input

31 21 3

Sample Output

1

解题思路:

搜索,确定每层点的个数。要得到长度为偶数的路径,必须是从第奇数层到第奇数层,或偶数层到第偶数层,那么只要统计出偶数层的点个数和与奇数层点个数和,然后求C2n加起来就可以得到答案了。
至于如何确定每层的点数,可以用DFS和BFS。
其实我一开始是想用DFS的,居然怕超时就写了个BFS,既然过了就懒得再改了。。。


Code:

#include <cstdio>#include <iostream>#include <queue>#include <cstring>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int maxm=511111;const int maxn=111111;struct EdgeNode{    int to;    int w;    int next;};struct Node{    int x,step;};EdgeNode edges[maxm];int N,M;int head[maxn],edge;bool vis[maxn];int dep[maxn];//第i层的点的个数queue <Node> que;int maxstep=0;void addedge(int u,int v,int c){    edges[edge].w=c,edges[edge].to=v,edges[edge].next=head[u],head[u]=edge++;}void init(){    memset(head,-1,sizeof(head));    edge=0;}void BFS(){    while(!que.empty())        que.pop();    que.push(Node{1,1});    vis[1]=1;    dep[1]++;    while(!que.empty())    {        Node u=que.front();        que.pop();        for(int i=head[u.x];i!=-1;i=edges[i].next)        {            int v=edges[i].to;            if(vis[v]==0)            {                vis[v]=1;                dep[u.step+1]++;                que.push(Node{v,u.step+1});                maxstep=u.step+1;            }        }    }}int main(){    int n;    init();    scanf("%d",&n);    for(int i=1;i<n;i++)    {        int x,y;        scanf("%d%d",&x,&y);        addedge(x,y,1);        addedge(y,x,1);    }    BFS();    LL odd=0,even=0;    for(int i=1;i<=maxstep;i++)    {        if(i%2==0)            odd+=dep[i];        else            even+=dep[i];    }    LL ans=odd*(odd-1)/2+even*(even-1)/2;    printf("%lld\n",ans);    return 0;}

DFS的代码:Wannafly挑战赛1 A.Treepath

原创粉丝点击