链式前向星&拉链式hush
链式前向星
废话不多说,直接粘链式前向星的代码
void add(int a,int b)
{
q[++cnt].to=b;
q[cnt].nxt=head[a];
head[a]=cnt;
}
思路:存储的东西是边,不是点(所以cnt就是边的序号)
to是这条边的下一个节点,head存储的是同起点的编号,在自己被存进去之后更新head为自己的编号,nxt(不用next是为了防止与头文件的变量名重复)就是指自己的下一条与自己同起点的编号,以此为思路,存储有向边&无向边(无向边=双向的有向边)
拉链式hush
思路:把大的数字通过取模存入小的数字中,然后重复的用链处理
1.取模操作
取模要选取一个合理的mod值(具体看题意)
可能有看过代码的同学要问了,为什么s%mod后还要再加一个mod再%mod?
因为s可能为负数,而我的要存的hush表里面为0~mod-1,不存在负数 所以再加一个mod防止负数存不进去
2.链式存储
假设x,y都要存入k链中,操作如图所示
借助链式思想,e[idy]存储我这idy的数值y,h[k]存储的k这个位置本来与之相连的编号idx,idy的下一位就指向这个本来的编号h[k]=idx,k这个位置就直接与idy相连(h[k]=idy)
代码:
#include
#define QWQ 0
#define N 100010
#define Mod 100003
using namespace std;
int h[N],idx,e[N],ne[N];
void insert(int s)
{
int k=(s % Mod + Mod ) % Mod;
e[idx]=s;
ne[idx]=h[k];
h[k]=idx++;//idx++是先存储id再++;++idx是先++再存储
}
bool find(int s)
{
int k=(s % Mod + Mod ) % Mod;
for(int i=h[k];i!=-1;i=ne[i])
{
if(e[i]==s) return 1;
}
return 0;
}
int main()
{
memset(h,-1,sizeof h);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
char op;
int a;
cin>>op>>a;
if(op=='I') insert(a);
else
{
if(find(a)==1) cout<<"Yes"<