码迷,mamicode.com
首页 > 其他好文 > 详细

2014年12程序设计竞赛A题Team

时间:2014-12-22 12:36:54      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

input:

输入一个整数你(n<=100000)和m,表示M的团队共有n个队员,有m次操作(m<100000)

接下来n-1行,输入两个数A和B,表示A和B是好盆友关系;

接下来m行,有如下操作(队员编号1——n):

D  x y  表示x与y绝交

Q  x  y  Q表示查询x是否是y盆友的盆友的盆友的。。。。。的盆友。

Output

对于Q操作,x是y的盆友的盆友的。。。。就输出Yes,否则输出No。

Sample Input

6 5

1 3

3 5

1  2

3 4

2  6

D  1 3

Q  1 6

Q 1  4

D  3  5

Q   1  4

sample output

自己算

解题思路:

        比赛的时候觉得我的方法会超时,就没有做。

技术分享

代码实现(没有提交过,不知道是否超时):

 

#include<stdio.h>
int cont[100000][100000]={0};//记录队员之间的关系
//cont[i][j]如果为1,表示i,j是好盆友;为1表示i,j不是好盆友
int teamN,opN;//队员人数,操作次数
void D(int x,int y)
{
    cont[x][y]=0;
    cont[y][x]=0;
}
int flag;
void Q(int x,int y)
{
    if(x==y){
        flag=1;
        return;
    }
    int i;
    for(i=1;i<=teamN;i++)
        if(cont[i][x]){
            cont[i][x]=0;
            cont[x][i]=0;
            Q(i,y);
            cont[i][x]=1;
            cont[x][i]=1;
        }
}
int main()
{
    scanf("%d%d",&teamN,&opN);
    int i;
    int team1,team2;//操作,队员1,队员2
    char opra;
    for(i=1;i<teamN;i++){//记录已有的好盆友
        scanf("%d%d",&team1,&team2);
        cont[team1][team2]=1;
        cont[team2][team1]=1;
    }
    getchar();
    for(i=0;i<opN;i++){
        scanf("%c%d%d",&opra,&team1,&team2);
    //    printf("%c\n",opra);
        getchar();
    //    printf("%c\n",opra);
        flag=0;
        if(opra==D) D(team1,team2);
        else if(opra==Q){
        //    printf("\\");
            Q(team1,team2);
            if(flag) printf("Yes\n");
            else printf("No\n");
        }
    //    printf("%d\n",flag);
    }
    return 0;
}

测试数据:

技术分享 技术分享

 

2014年12程序设计竞赛A题Team

标签:

原文地址:http://www.cnblogs.com/yanglingwell/p/4177864.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!