zoukankan      html  css  js  c++  java
  • 2017年第十届河南省ACM省赛 B题情报传递

    情报传递

    题目描述
    抗日战争时期,在国共合作的大背景下,中共不断发展壮大,其情报工作也开始由获取警报性、保卫性信息,向获取军政战略性情报转变。各系统情报组织遵循”荫蔽精干,长期埋伏,积蓄力量,以待时机”的隐蔽战线工作方针,开展了卓有成效的情报工作。
    *特科组是中共情报工作的一个杰出范例,它以点为主、系统延伸、分散辐射的力量格局,异地领导、分头派遣、单线联系的组织形式。以打入、拉出、统战联络、内线为主的工作方式,形成了一个传递信息隐蔽、效用及时、形式多样的情报网络。
    *特科组的情报人员共有N人,其代号分别为0,1,……,N-1。 0号是最高领导人,特工之间有一套严格的单线联络程序,即,每个特工人员只有一个上线,他获得的情报需层层上传递到0号手里,由0号发报出去。
    特工i在传递情报时,若通往到0号的通道尚未建立,则需要建立一级级单线通道;若他的上线已建立好通道,只需建立两人通道,信息发送给上线;依次类推。若特工i已建立好到0号的通道,则直接发出情报。日伪统治中心南京,既是情报来源丰富的地方,又是特工人员活动最危险的地方。因此,一旦某个特工处于不安全状态,他必须马上撤离,同时他的所有下线(处在通道上的一级级下线)也一同撤离。
    已知*特科组的组织结构,你的任务是计算,当某特工i需要发送情报时,最少需要建立几个情报人员的通道;当某特工i处于不安全状态时,最少需要撤离多少人员。
    输入
    第一行一个整数: N ( 1≤N ≤5060 )
    接下来一行有N-1 个整数, A1 A2 ……An-1 ,其中Ai是编号i的上线。
    下一行一个整数: M 表示有M个状态,( 1≤M ≤5060 )
    接下来有M行 :有两种形式: Send i 特工i处于要发送情报状态;
    Danger i 特工i处于不安全状态
    输出
    输出占M行 ,对于Send i,输出最少需要建立通道的情报人员数,若特工i处于通道线上,输出0;对于Danger i,输出最少需要撤离多少人员,若特工i不处于通道线上,则输出0.
    样例输入
    10
    0 1 2 1 3 0 0 3 2
    10
    Send 0
    Send 3
    Danger 2
    Send 7
    Send 5
    Send 9
    Danger 9
    Send 4
    Send 1
    Send 9
    样例输出
    1
    3
    2
    1
    3
    1
    1
    1
    0
    1

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<queue>
    using namespace std;
    vector<int>serialnumber[5100];
    int serial[5100];
    int state[5100];
    int sum;
    int bfs(int n)
    {
        queue<int>q;
        int sum=0;
        int t,h;
        state[n]=0;
        q.push(n);
        while(!q.empty())
        {
            t=q.front();
            q.pop();
            sum++;
            int sizea=serialnumber[t].size();
            for(int i=0;i<sizea;i++)
            {
                h=serialnumber[t][i];
                if(state[h]==1)
                {
                    state[h]=0;
                    q.push(h);
                }
            }
        }
        return sum;
    }
    int dfs(int i,int sum)
    {
        if(i==-1||state[i])
            return sum;
        else
        {
            state[i]=1;
            int head=serial[i];
            dfs(head,sum+1);
        }
    }
    int main()
    {
        int l,m,n;
        scanf("%d",&l);
        serial[0]=-1;
        memset(state,0,sizeof(state));
        for(int i=1;i<l;i++)
        {
            scanf("%d",&serial[i]);
            serialnumber[serial[i]].push_back(i);
        }
        scanf("%d",&m);
        char a[10];
        while(m--)
        {
            scanf("%s %d",&a,&n);
            sum=0;
            if(a[0]=='S')
            {
                if(state[n])
                    printf("0
    ");
                else
                {
                    sum=dfs(n,0);
                    printf("%d
    ",sum);
                }
            }
            else
            {
                if(state[n]==0)
                    printf("0
    ");
                else
                {
                    sum=bfs(n);
                    printf("%d
    ",sum);
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    分布式数据库拆分表常用的方法
    linux服务器502错误详解【转载】
    全国各城市代码
    Linux下git安装
    linux上访问windows目录
    百度技术总监谈12306高性能海量并发网站架构设计
    Ubuntu 10.04 安装无线网卡驱动。
    晕菜, silverlight !
    linux 软件记录.
    硬盘安装 Ubuntu10.04
  • 原文地址:https://www.cnblogs.com/nanfenggu/p/7900159.html
Copyright © 2011-2022 走看看