首页 > 代码库 > 2014年12程序设计竞赛A题Team

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

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