标签:
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; }
测试数据:
标签:
原文地址:http://www.cnblogs.com/yanglingwell/p/4177864.html