这个题也算是个搜索题吧,网上说可以用DFS做,双向链表做等等。
我最终还是用的并查集做的,题目的意思就是说有N个点,Q表示询问两点是否连通,I表示将两点进行连通(相当于增加一个直接相连的路径),D表示删除两点之间直接相连的路径。
并查集做的话只是每次删除的时候需要重新进行一个初始化,时间费的不是太多,C++ 900多MS吧
代码:
#include<cstdio>
#include<cstring>
#define MAXN 1001
#define MAXQ 20001
using namespace std;
struct node
{
int u;
int v;
}node[MAXQ];
int n,m,p[MAXN];
bool w[MAXN][MAXN];
void init()
{
for(int i=0;i<=n;i++)
p[i]=i;
}
int find(int x)
{
if(p[x]==x)
return x;
return p[x]=find(p[x]);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&m);
init();
memset(w,0,sizeof(w));
int cou=0;
while(m--)
{
char op[5];
scanf("%s",op);
int ita,itb;
if(op[0]=='Q')
{
scanf("%d%d",&ita,&itb);
printf("%c\n",find(ita)==find(itb)?'Y':'N');
}
else if(op[0]=='I')
{
scanf("%d%d",&node[cou].u,&node[cou].v);
int ita=find(node[cou].u);
int itb=find(node[cou].v);
w[node[cou].u][node[cou].v]=1;
w[node[cou].v][node[cou].u]=1;
if(ita!=itb)
p[ita]=itb;
cou++;
}
else
{
scanf("%d%d",&ita,&itb);
w[ita][itb]=0;
w[itb][ita]=0;
init();
for(int i=0;i<cou;i++)
if(w[node[i].u][node[i].v])
{
int x=find(node[i].u);
int y=find(node[i].v);
p[x]=y;
}
}
}
}
return 0;
}