zoukankan      html  css  js  c++  java
  • 蝉(90分的暴力)

    n个点的树,m次操作
    给出一棵树,维护下列操作:
    1.在x位置放上一只蝉。(如果已经有蝉,忽略此操作)
    2.查询x位置的坏掉指数(坏掉指数是指距x位置最近的蝉的距离)
    一开始时在1的位置有一只蝉。
    10% N,M ≤ 10
    40% N,M ≤ 100
    100% N ≤ 2 × 10^5 ,M ≤ 10^5

    那我们用暴力来做好了,每次放入蝉时,更新一下每个蝉的坏掉指数,用bfs或者dfs来实现。此处有一个剪枝,如果更新到的点的坏掉指数<=更新来的前一个点的坏掉指数+1,那就不用再往下更新了。
    这样可以拿到90分。最好是在1操作时跑一下暴力,因为一般都是查询的点比较多。

    dfs

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,m;
    int head[200009],nxt[400009],num[400009],cnt;
    int mind[200009];
    void add(int x,int y)
    {
        cnt++;
        num[cnt]=y;
        nxt[cnt]=head[x];
        head[x]=cnt;
    }
    int ans;
    void dfs(int x,int step,int father)
    {
        mind[x]=min(mind[x],step);
        for(int i=head[x];i;i=nxt[i])
        {
            if(num[i]!=father&&step<mind[num[i]]) dfs(num[i],step+1,x);
        }
    }
    int main()
    {
        //freopen("cicada.in","r",stdin);
        //freopen("cicada.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);add(y,x);
        }
        memset(mind,127,sizeof(mind));
        dfs(1,0,0);
        for(int i=1;i<=m;i++)
        {
            int opt,x;
            scanf("%d%d",&opt,&x);
            if(opt==1&&mind[x]) dfs(x,0,0);
            else {printf("%d
    ",mind[x]);}
        }
        return 0;
    }

    bfs

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,m;
    int head[200009],nxt[400009],num[400009],cnt;
    int mind[200009];
    void add(int x,int y)
    {
        cnt++;
        num[cnt]=y;
        nxt[cnt]=head[x];
        head[x]=cnt;
    }
    void bfs(int x)
    {
        queue <int> q;
        q.push(x);
        while(!q.empty())
        {
            int k=q.front();q.pop();
            for(int i=head[k];i;i=nxt[i])
            {
                if(mind[num[i]]>mind[k]+1) 
                q.push(num[i]),mind[num[i]]=mind[k]+1;
            }
        }
    }
    int main()
    {
        freopen("cicada.in","r",stdin);
        freopen("cicada.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);add(y,x);
        }
        memset(mind,127,sizeof(mind));
        mind[1]=0;
        bfs(1);
        while(m--)
        {
            int opt,x;
            scanf("%d%d",&opt,&x);
            if(opt==1&&mind[x]) mind[x]=0,bfs(x);
            else printf("%d
    ",mind[x]); 
        }
        return 0;
    }
  • 相关阅读:
    [LUPA学习向导]如何成为Linux平台C语言程序员
    C程序调用shell脚本共有三种方法
    用C语言编写一个Linux下的简单shell程序
    利用sscanf()匹配字符串需要注意贪婪匹配
    对于初学者来说,选择合适的开发板非常之非常重要呀
    迅为IMX6ULL开发板C程序调用shell
    迅为-iMX6ULL开发板上配置AP热点
    迅为iMX6开发板-设备树内核-menuconfig的使用
    双11买它阿,零基础配套视频教程4412开发板嵌入式入门
    迅为-iMX6ULL开发板-移植mjpg-streamer实现远程监控
  • 原文地址:https://www.cnblogs.com/dfsac/p/7587891.html
Copyright © 2011-2022 走看看